javascript闭包的混乱

javascript闭包的混乱,javascript,closures,Javascript,Closures,事实证明,我并不真正理解javascript闭包,下面的代码让我感到困惑。我以为fxn会访问外部foo,但它实际上打印出了“欠罚款”。为什么 这是因为在JavaScript中,变量获取 变量在创建时初始化为未定义。带有 初始化器在以下情况下被分配其AssignmentExpression的值: VariableStatement是执行的,而不是在创建变量时执行的 因此,在语义上,您的代码将等价于以下内容 var foo = "hello"; function fxn(){ var foo;

事实证明,我并不真正理解javascript闭包,下面的代码让我感到困惑。我以为fxn会访问外部foo,但它实际上打印出了“欠罚款”。为什么


这是因为在JavaScript中,变量获取

变量在创建时初始化为未定义。带有 初始化器在以下情况下被分配其AssignmentExpression的值: VariableStatement是执行的,而不是在创建变量时执行的

因此,在语义上,您的代码将等价于以下内容

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

在函数外部定义变量
foo
。如果重复调用
var
,则会在函数内重新定义变量,并且该变量将丢失其分配

删除函数中的
var
,以访问函数
fnx
中的
foo

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

fxn();

无法复制。它将记录未定义的日志,但警告
hello
您能再解释一下吗?您在函数之外定义了变量“foo”。如果您重复调用“var”,您将在函数内部重新定义变量,它将丢失其分配。。。2) 在定义变量之前,您正在使用它=>'undefined'(另请参见C5H8NNaO4答案)@Hezi For me
foo
是本例中的全局变量()。因此,变量被定义,并在
alert()之后更新。@R3tep正确。但在最初的问题中,变量是使用“var”重新定义的。
var foo = "hello";
function fxn(){
   alert(foo);
   foo = "test";
}

fxn();