var x = 3;
(function (){
console.log('before', x);
var x = 7;
console.log('after', x);
return ;
})();
在上面的代码中,var X全局初始化。所以在函数内部,第一个console.log应该打印“3之前”,但我没有得到它。原因是我试图重新声明全局变量。
有人可以解释为什么会这样吗?
答案 0 :(得分:5)
在上面的代码中,var X全局初始化。所以在函数内部,第一个console.log应该打印“3之前”。
不,它应该打印before undefined
,因为var
从函数的开头起生效,无论你在哪里写它。
您的代码完全与此相同:
var x = 3;
(function (){
var x;
console.log('before', x);
x = 7;
console.log('after', x);
return ;
})();
当然,变量以值undefined
开头。
答案 1 :(得分:4)
解析代码时,JavaScript解析器会Variable Hoisting。这意味着任何变量声明都将移动到当前作用域的顶部,因此在您的情况下,此代码将被执行:
var x = 3;
(function (){
var x;
console.log('before', x);
x = 7;
console.log('after', x);
return ;
})();
因此,您的本地变量x
首先被声明,初始值为undefined
。
这应该解释为什么你得到第一个console.log()
的“beforeundefined”。
答案 2 :(得分:1)
变量的范围比其他语言简单得多。它不是从声明开始,而是:
MDN:
用var声明的变量的范围是封闭函数 或者,对于在函数外声明的变量,全局范围( 绑定到全局对象)。
您可以想象所有变量声明都会移动到范围的开头(函数)。所以这就像
var x = 3;
(function (){
var x;
console.log('before', x); // now undefined
x = 7;
console.log('after', x); // now 7
return ;
})();
小心了解确切的范围(函数,而不是块):
var x = 3;
(function (){
console.log('before', x); // this is undefined !
if (true) {
var x = 7;
}
return ;
})();