我一直在玩一些毫无意义的逻辑和范围,并注意到一些令我困惑的奇怪行为......
var test = 1;
(function(){
console.log(test); //its 1
})();
var test = 1;
(function(){
console.log(test); //its 1
test = 2;
})();
var test = 1;
(function(){
console.log(test); //Uncaught ReferenceError: test is not defined
var test = 2;
})();
在下面的示例中,我希望最后一个函数能够注销1,直到在该范围内重新分配测试,但是它是未定义的,如果我删除了范围声明并重新分配顶级测试,那么它会按预期注销1。
有人可以解释为什么最后一个例子test
变得未定义吗?
答案 0 :(得分:1)
最后一个片段大致等于
var test = 1;
(function(){
var test; // it is undefined here as it is not initialized yet
console.log(test); // undefined
test = 2; // initialized
console.log(test); // hence 2
})();
由于变量声明被提升到函数的顶部。因此,当您记录test
时,undefined
为test
并且过度遮蔽了外面的{{1}}。
答案 1 :(得分:0)
非常好article解释会发生什么(以及许多细节!):
函数声明和变量声明总是被JavaScript解释器无形地移动(“提升”)到其包含范围的顶部。
这就是为什么在声明本地变量之前无法访问全局变量的原因。在同一范围内访问具有相同名称的两个不同变量是不是很奇怪?