为什么会出错:
var a = [c];
// ERROR: c is not defined
但这不会(但导致未定义):
var a = [c];
var c = 'x';
console.log(a); // [undefined]
答案 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解释器读取该代码,它就会声明变量a
和c
。这看起来像
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];