JavaScript十日谈,变量声明与作用域

2022-02-25  本文已影响0人  低着头走路

第一日,var的问题

你好,max

你一直在用var声明变量吗?

对啊,为什么问这个问题,我甚至觉得这不应该是个问题。不用var用什么?

好吧,看来你还没有接触过es6。那我换一种问法,你在使用var的过程中有遇到过什么问题吗?

这倒是有,好像还不止一个。

第一个问题

我在for循环中定义的变量i,循环结束后,在循环体外面居然可以访问到这个变量i,并且有值。

还有,我在一个if语句内声明了一个变量k,哪怕这个if语句永远不会执行,我依然可以在if语句外访问到这个变量k。

再就是,我定义了一个变量,又定义了一个函数,我把函数放在了变量的上面,却不影响这个函数对变量的访问。

我一直疑惑,这是为什么,你知道是怎么回事吧。

这个现象叫变量提升。

是说用var定义的变量,会在当前作用域内发生位置变换,将其挪到最顶部,相当于你是在第一行定义了一个变量。

我们回头看一下你刚说的那几种情况,是不是得到了合理的解释。

对于for循环相当于

var i;for(i=0;i<10;i++)console.log(i)

对于if内定义相当于

var k;if(false)console.log(k)

对于函数前置相当于

var f;function()console.log(f)

原来如此!

那这个变量提升现象能避免吗?我还是希望程序完全按照自己的预期来执行。

当然可以,那就是es6新引入的变量声明方式let,这个改天再谈,今天我们就只关心var

上一篇 下一篇

猜你喜欢

热点阅读