为什么这会给出错误:
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)
这就是所谓的hoisting
和手段,你的Javascript引擎将declare
所有var
statments并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解释器读取该代码,它就会声明变量a
和c
.这看起来像
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)
归档时间: |
|
查看次数: |
418 次 |
最近记录: |