var x = 3;
(function (){
console.log('before', x);
var x = 7;
console.log('after', x);
return ;
})();
在上面的代码中,var X 被全局初始化。因此,在函数内部,第一个 console.log 应该打印“3 之前”,但我不明白。原因是我试图重新声明全局变量。
有人可以解释为什么会这样吗?
var x = 3;
(function (){
console.log('before', x);
var x = 7;
console.log('after', x);
return ;
})();
在上面的代码中,var X 被全局初始化。因此,在函数内部,第一个 console.log 应该打印“3 之前”,但我不明白。原因是我试图重新声明全局变量。
有人可以解释为什么会这样吗?
在上面的代码中,var X 被全局初始化。所以在函数内部,第一个 console.log 应该打印“before 3”。
不,它应该 print before undefined
,因为var
无论您在哪里编写它,它都会从函数的开头生效。
您的代码与此完全相同:
var x = 3;
(function (){
var x;
console.log('before', x);
x = 7;
console.log('after', x);
return ;
})();
当然,变量以 value 开头undefined
。
详情:差错误会var
JavaScript 解析器在解析代码时会执行变量提升。这意味着任何变量声明都将移至当前范围的顶部,因此在您的情况下,将执行以下代码:
var x = 3;
(function (){
var x;
console.log('before', x);
x = 7;
console.log('after', x);
return ;
})();
所以你的局部变量x
首先被声明为初始值为undefined
.
这应该解释为什么你会得到一个“beforeundefined”作为第一个console.log()
。
变量的作用域比其他语言简单得多。它不是从声明开始,而是:
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 ;
})();