javascript - 这些 block 的 JS 范围如何工作?

标签 javascript scope closures lexical-closures

谁能解释为什么下面的产生 1,2 而另一个产生 5?他们不应该都生产5吗?

//produces 1,2
(function () {

    var a = [5];

    function bar() {
        if (!a) {
          var a = [1, 2];
        }
        console.log(a.join());
    }

    bar();

})();

根据阅读一些关于 JS 闭包的文章,我希望它们都产生 5。似乎找不到任何文章可以提供一些关于为什么第一个 block 产生其他结果的见解。

//produces 5
(function () {

    var a = [5];

    function bar() {
        if (a) {
          console.log(a.join());
        }
        else {
          console.log([1, 2].join())
        }
    }

    bar();

})();

谢谢!

最佳答案

由于 javascripts var hoisting ,这段代码:

(function () {
    var a = [5];
    function bar() {
        if (!a) {
          var a = [1, 2];
        }
        console.log(a.join());
    }
    bar();
})();

相当于这段代码:

(function () {
    var a = [5];
    function bar() {
        var a; // a === undefined at this point
        if (!a) {
          a = [1, 2];
        }
        console.log(a.join());
    }
    bar();
})();

所以你可以看到,当测试 if 条件时,a 确实是 falsey(即 !a === true)

关于javascript - 这些 block 的 JS 范围如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40734482/

相关文章:

Javascript 显式 block

javascript - 在javascript中将函数分配给变量时识别变量

javascript - jquery如何获取选中的选项id

javascript - jQuery 定位 this > a,其中 a 不是主题

Java 开关 : variable declaration and scope

javascript - Greasemonkey 中的 GM_getValue 返回未定义

Python闭包,为每个嵌套函数创建具有不同ID的新int

javascript - 为什么 javascript 的 ES6/Harmony Set 对象会为键/值/条目方法返回空对象?

javascript - ReactJS 中 <select> 标签的 onChange 事件的替代方案?

jquery - Facebook 对于电子邮件和生日返回未定义