第一日,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
网友评论