嵌套作用域内的JavaScript变量不会在作用域之外得到错误

时间:2018-05-08 05:08:48

标签: javascript

我猜不出为什么会在下面的代码中发生这种情况:

(function(){
    console.log(`v1: `,v1); // show "undefined"
    console.log(`v2: `,v2); // show "Uncaught ReferenceError: v2 is not defined"

    if (true) {
        var v1 = 'something';
    }
})();

为什么v1显示undefined?如果必须要v2,因为v1if块内定义。

3 个答案:

答案 0 :(得分:4)

这是因为Hoistingv1的声明首先发生,然后是作业。

您的代码实际上解释为:



(function(){
    var v1;
    console.log(`v1: `,v1); // show "undefined"
    console.log(`v2: `,v2); // show "Uncaught ReferenceError: v2 is not defined"

    if (true) {
        v1 = 'something';
    }
})();




答案 1 :(得分:2)

使用var声明变量将其定义提升到函数范围的顶部。因此v1已声明但未定义(您在v1下定义if)。 v2未在函数范围内声明,因此出现了不同的错误。

答案 2 :(得分:1)

此行为称为Hoisting

  

从概念上讲,例如,对提升的严格定义表明变量和函数声明在物理上移动到代码的顶部,但事实上并非如此。相反,变量和函数声明在编译阶段被放入内存中,但保留在编码中键入的位置。

     

JavaScript只提升声明,而不是初始化。如果在使用变量后声明并初始化该变量,则该值将是未定义的