如何用变量范围解释这个问题?

时间:2011-10-17 16:35:06

标签: javascript scope

为什么第二个函数输出一个空数组?

var global = ["abc"];

function test1() {
    var g = global || [];
    console.log(g);             //outputs: ["abc"]
}

function test2() {
    var global = global || [];
    console.log(global);        //outputs: []
}

3 个答案:

答案 0 :(得分:5)

虽然它似乎应该有效,因为赋值从右到左,你需要考虑 变量声明被提升

对于解释器,您的代码实际上如下所示:

function test2() {
    var global; // global is undefined

    global = global || []; // because undefined is falsey, the [] is assigned

    console.log(global); // displays the []
}

答案 1 :(得分:1)

var global将符号global重新定义为该函数范围内的局部变量,从而使另一个global不可见。如果要执行第二个函数的操作,请使用其他名称:

var global = ["abc"];

function test2() {
    var local = global || [];
    console.log(local);        //outputs: ["abc"]
}

或者,如果global的原始定义确实是一个全局变量,当它的常规符号被局部变量隐藏时,你可以使用window对象来引用它(虽然我不建议这样做因为它可能会让试图理解你的代码的人感到困惑:

var global = ["abc"];

function test2() {
    var global = window.global || [];
    console.log(global);        //outputs: ["abc"]
}

答案 2 :(得分:0)

输出空名称的原因是因为一旦您有名称冲突。有一个名为global的本地和全局。在将global定义为本地所有出现的函数内部将引用本地。它永远不会看到全球价值。

因此,行var global = global || []global解释为本地。它目前是undefined因此它选择[]

使这项工作的一种方法是使用全局实例的限定名称

function test2() {
  var global = window.global || [];
  console.log(global); // outputs ["abc"]
}