Javascript未定义的数组值

时间:2011-08-01 11:40:29

标签: javascript arrays

为什么会出错:

var a = [c];
// ERROR:  c is not defined

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

var a = [c];
var c = 'x';
console.log(a); // [undefined]

jsFiddle

3 个答案:

答案 0 :(得分:8)

它被称为hoisting,意味着您的Javascript引擎将declare所有var个名称和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;
    }
}

如果我们运行what(),我们会收到huh, where is foobar??消息。这是因为在what的执行上下文中,当解释器读取我们的代码时,变量foobar被声明(未定义)。声明总是undefined。上下文中var语句的位置无关紧要!它总是被“提升”。

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

现在查看您的示例代码,我们可以轻松回答会发生什么。

var a = [c];
var c = 'x';
console.log(a); // [undefined]

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

var a, c;
a = [c];
c = 'x';

或更具表现力

var a = undefined, c = undefined;
a = [c];    // c is undefined
c = 'x';    // and finally gets defined as 'x', but too late.

答案 1 :(得分:3)

吊装:分散​​变量的问题

JavaScript使您可以在函数中的任何位置拥有多个var语句 它们都表现为好像变量是在函数顶部声明的。这种行为是 称为吊装。当您使用变量然后使用变量时,这可能会导致逻辑错误 在函数中进一步声明它。对于JavaScript,只要变量是相同的 范围(相同的函数),它被认为是声明的,即使它在var之前使用 宣言。看一下这个例子:

// antipattern
myname = "global"; // global variable
function func() {
   alert(myname); // "undefined"
   var myname = "local";
   alert(myname); // "local"
}
func();

在这个例子中,您可能期望第一个alert()将提示“global”和 第二个会提示“本地”。这是一个合理的期望,因为,当时 第一个警报,myname没有声明,因此该功能可能应该“看到” 全球的myname。但这不是它的工作原理。第一个警报会说“未定义” 因为myname被认为是函数的局部变量。 (虽然 声明来自。)所有变量声明都被提升到了顶部 功能。因此,为了避免这种混淆,最好先声明所有变量 你打算用。 上面的代码片段的行为就像它是这样实现的那样:

myname = "global"; // global variable
function func() {
   var myname; // same as -> var myname = undefined;
   alert(myname); // "undefined"
   myname = "local";
   alert(myname); // "local"
}
func();

“JavaScript模式,Stoyan Stefanov(O'Reilly)。版权所有2010 Yahoo!,Inc.,9780596806750。“

答案 2 :(得分:0)

当您尝试在数组中使用变量'c'时,它不存在。 你应该这样做:

var c = 'x';
var a = [c];