我已被证明我并不真正了解javascript封闭,我对以下代码感到困惑。我以为fxn会访问外部foo,但它实际上打印出“underfined”。为什么?
var foo = "hello";
function fxn(){
alert(foo);
var foo = "test"
}
fxn();
答案 0 :(得分:6)
这是因为在JavaScript中,变量得到hoisted,这意味着
创建时,变量初始化为 undefined 。变量用 Initialiser 分配了 AssignmentExpression 的值 VariableStatement 是执行,而不是在创建变量时。 (ES5 §12.2)
因此,在语义上,您的代码将等同于以下内容......
var foo = "hello";
function fxn(){
var foo; //Variables are initialised to undefined when created
alert(foo);
foo = "test"; //A variable with an *Initialiser* is assigned the value of its *AssignmentExpression* when the *VariableStatement* is **executed**
}
fxn();
答案 1 :(得分:1)
您可以在函数外定义变量foo
。如果您重复调用var
,则会重新定义函数内部的变量并丢失其分配。
删除函数中的var
以访问foo
函数fnx
。
var foo = "hello";
function fxn(){
alert(foo);
foo = "test";
}
fxn();