为什么第二个函数输出一个空数组?
var global = ["abc"];
function test1() {
var g = global || [];
console.log(g); //outputs: ["abc"]
}
function test2() {
var global = global || [];
console.log(global); //outputs: []
}
答案 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"]
}