先看一个简单的例子:
var a='Hello World';
(function(){
console.log(a);
})()
结果很明显,打印出Hello World
另外一个例子来了:
var a='Hello World';
(function(){
console.log(a);
var a = "good morning!";
})()
结果有点意外,打印的是undefined,为什么呢?看看上面代码的等价变换:
var a='Hello World';
(function(){
var a;
console.log(a);
a = "good morning!";
})()
这里在函数作用域中变量声明 (var a) 提升了,但是初始化(a = "good morning!") 并不会提升,所以 a 变量是一个未定义的变量。
总结一点就是在一个作用域中,声明可以提升,赋值不能提升。