javascript - JavaScript `var` 关键字的混淆操作

标签 javascript v8 spidermonkey

我遇到了一个关于 var 关键字的(对我来说)非常奇怪的问题。我已将它简化为一个相当小的测试用例,并发现它在 Node.js(因此是 V8 和 Chrome)、Safari 4 的检查器(因此是 Nitro)和 FireBug(显然是 SpiderMonkey)中都有展示。我最初是准备一份错误报告,但由于它被广泛展示,我假设我完全误解了 JavaScript 应该如何确定范围和查找变量。

测试用例非常小,在 GitHub 上:http://gist.github.com/260067 .第一个示例和第二个示例之间的唯一区别是包含了 var 关键字。

这里还有一个类似的测试用例,它以不同的方式展示了相同的“问题”:https://gist.github.com/698b977ee0de2f0ee54a

编辑:为了排除更多试图解释级联作用域如何工作的答案,我对此非常熟悉。我的问题是,我不明白为什么以下代码“有效”(因为它 alert() 是“outer”,然后是“inner”,然后又是“outer”):

(function(){
  var foo = 'outer';
  alert("Outer `foo`: " + foo);

  (function(){
    foo = 'inner';
    alert("Inner `foo`: " + foo);

    var foo;
  })();

  alert("Outer `foo`: " + foo);
})();

var foo; 出现在与 foo 的重新赋值完全不相关的位置;那么为什么它会以非常实质性的方式影响该作业?

最佳答案

问题在于,与其他语言不同,JavaScript 在函数的开头创建所有变量。这意味着代码:

(function(){
    if(myVar == undefined){
        alert(myVar);
    }
    if(myVar == undefined){
        var myVar = 5;
    }
})();

实际上被编译解释为

(function(){
    var myVar;
    if(myVar == undefined){
        alert(myVar);
    }
    if(myVar == undefined){
        myVar = 5;
    }
})();

要创建一个变量并且只在 if 或循环 block 中使用它,你必须使用 let ,这是一项新的 JavaScript 功能。我不确定有多少浏览器实现了它(如果您使用 <script type="text/javascript;version=1.7">,Firefox 3.5 会实现)。

(function(){
    if(myVar == undefined){
        alert(myVar);
    }
    if(myVar == undefined){
        let myVar = 5;
    }
})();

关于javascript - JavaScript `var` 关键字的混淆操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1932910/

相关文章:

javascript - 当数据不在范围内时如何使用正则表达式返回 false?

javascript - Fadein() 对函数的效果 : how to?

MongoDB SpiderMonkey 不理解 UTF-8

javascript - 在 asm.js 代码中检查 NaN

c++ - 针对 V8 编译 NodeJs 模块

javascript - V8(或其他 JS 引擎)BigInt 实现 - 显示为十进制

javascript - json如何将行转换为列

javascript - 使用 Mongoose 将 GridFS-Stream 文件与架构关联

linux - 为什么我没有scaling_governor?

javascript - 为什么堆内存使用量不断上升?