var foo = 1
function f(){
console.log(foo)
var foo = 2
console.log(foo)
}
此段代码输出的分别是undefined 和2
image.png
虽然在外面声明了一个foo,但是在函数里也同样声明了一个foo变量。所以,函数内部的foo就会将外部的全局变量暂时覆盖掉。注意,只在当前函数内覆盖,其他地方使用全局变量依旧是1的值。
函数中的代码可以看成是
function f(){
var foo
console.log(foo)
foo = 2
console.log(foo)
}
因为var了foo变量,所以这个时候变量的声明提升到了代码段的最顶部。也就是第一次打印的上面一行。
但是变量提升是只提升声明,不提升赋值的。所以仅仅是提升了一个 var foo 。这个时候第一次打印自然也就是输出undefined 了。而第三行给foo付了一个值。那第四行打印自然就打印出了2。
知识点:局部声明的变量和全局的变量同名时,在局部会覆盖掉全局变量。但是不影响全局变量在别处使用。
变量提升只提升声明不提升赋值
网友评论