Javascript未定义的数组值

tsk*_*zzy 1 javascript arrays

为什么这会给出错误:

var a = [c];
// ERROR:  c is not defined
Run Code Online (Sandbox Code Playgroud)

但这不会(但导致未定义):

var a = [c];
var c = 'x';
console.log(a); // [undefined]
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

jAn*_*ndy 8

这就是所谓的hoisting和手段,你的Javascript引擎将declare所有varstatments并function declarations分析时.换句话说,var执行该脚本时,所有语句都已声明(但未定义).

有时可能会有麻烦.例:

var foobar = true;

function what() {
    if( foobar ) {  // should be true, no?
        alert('foobar is defined');
    }
    else {
        alert('huh, where is foobar??');
        var foobar = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们跑what(),我们得到huh, where is foobar??消息.这是因为在执行上下文中what,foobar当解释器读取我们的代码时,变量被声明(未定义).声明总是如此undefined.var在上下文中语句存在的位置并不重要!它总是被"提升".

完全避免这种错误的好建议是,在每个上下文/函数的顶部声明和定义所有使用的变量.

现在查看您的示例代码,我们可以轻松回答发生的情况.

var a = [c];
var c = 'x';
console.log(a); // [undefined]
Run Code Online (Sandbox Code Playgroud)

一旦我们的javascript解释器读取该代码,它就会声明变量ac.这看起来像

var a, c;
a = [c];
c = 'x';
Run Code Online (Sandbox Code Playgroud)

或者,甚至更具表现力

var a = undefined, c = undefined;
a = [c];    // c is undefined
c = 'x';    // and finally gets defined as 'x', but too late.
Run Code Online (Sandbox Code Playgroud)