var x = 3;
(function(){
console.log('before', x);
var x = 7;
console.log('after', x);
return ;
})();
在上面的代码中,var X是全局初始化的。所以在函数内部,第一个console.log应该打印“3之前”,但我不明白。原因是我想重新声明全局变量。由于全球范围变量导致的javascript错误
有人可以解释为什么会发生这种情况吗?
var x = 3;
(function(){
console.log('before', x);
var x = 7;
console.log('after', x);
return ;
})();
在上面的代码中,var X是全局初始化的。所以在函数内部,第一个console.log应该打印“3之前”,但我不明白。原因是我想重新声明全局变量。由于全球范围变量导致的javascript错误
有人可以解释为什么会发生这种情况吗?
解析你的代码时,JavaScript分析器不Variable Hoisting。这意味着,任何变量的声明会在你的情况下被移动到当前范围的顶部,因此,这段代码将得到执行:
var x = 3;
(function(){
var x;
console.log('before', x);
x = 7;
console.log('after', x);
return ;
})();
所以你的局部变量x
被宣布在第一次使用的undefined
初始值。
这应该解释一下,为什么你会得到一个“beforeundefined”第console.log()
。
在上面的代码变种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
。
变量的范围比其他语言要简单得多。它不会在声明开始,但有两种情况:
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 ;
})();
链接回答你的问题:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting FWIW,你正在寻找“提升”。 –