一开始总是傻傻分不清变量提升的问题,现在终于搞清楚了
① 输出结果 : undefined 2
1. var foo = 1;
2. (function(){
3. console.log(foo);
4. var foo = 2;
5. console.log(foo);
6. })()
之前总是傻傻填1,2,真心想一棒子打死自己,首先在这里提一下变量提升的定义(函数声明与变量声明会被 JavaScript 引擎隐式地提升到当前作用域的顶部,但是只提升名称不会提升赋值部分),所有在第四行的时候,已经重新声明了foo,但并没有赋值,相当于在第3行前面加入var foo;声明了foo,所以第3行输出的就是 undefined,而第四行已经赋值为2了,所以第5行输出的就是 2
也就是当内部声明了和全局的变量同名时,就会出现变量提升的效果,声明语句会提升到函数的第一句。这就是著名的变量提升效果。
② 输出值为 1 ,2 ,2
1. var foo = 1;
2. (function(){
3. console.log(foo);
4. foo = 2;
5. console.log(foo);
6. })()
7. console.log(foo)
第4行中foo=2,并没有var声明,所以foo仍然属于全局变量,所以第3行输出就是全局变量foo的值为1,因为在第4行中foo重新赋值为2,所以第5行输出就是2,在函数体中,全局变量foo已经被重新赋值,所以第7行输出也就是2