javascript关闭的混乱

时间:2014-02-10 12:25:57

标签: javascript closures

我已被证明我并不真正了解javascript封闭,我对以下代码感到困惑。我以为fxn会访问外部foo,但它实际上打印出“underfined”。为什么?

var foo = "hello";
function fxn(){
   alert(foo);
   var foo = "test"
}

fxn();

2 个答案:

答案 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();

Jsfiddle