在自己的范围内重新分配时,为什么值未定义?

时间:2015-02-05 14:39:56

标签: javascript

我一直在玩一些毫无意义的逻辑和范围,并注意到一些令我困惑的奇怪行为......

        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变得未定义吗?

2 个答案:

答案 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时,undefinedtest并且过度遮蔽了外面的{{1}}。

答案 1 :(得分:0)

非常好article解释会发生什么(以及许多细节!):

  

函数声明和变量声明总是被JavaScript解释器无形地移动(“提升”)到其包含范围的顶部。

这就是为什么在声明本地变量之前无法访问全局变量的原因。在同一范围内访问具有相同名称的两个不同变量是不是很奇怪?