作为函数参数传递的匿名函数的范围

Al *_* R. 5 javascript scope

鉴于以下代码,我应该在警报中看到什么?

var a = 100;
function afunc(infunc){
  a = 10;
  infunc.call();
}

afunc(function(){alert(a)});
Run Code Online (Sandbox Code Playgroud)

我最初的想法是我的浏览器应该提醒100,因为变量a = 100将作为作为afunc参数传递的匿名函数的范围.但是这假设匿名函数实际上是在全局上下文中定义的.显然情况并非如此,因为浏览器提醒10.那么为什么在范围链中a = 10之前a = 10?

谢谢!

Ric*_*ngi 6

因为您在调用匿名函数之前将a设置为10.a实际上是全局的,但你将它设置为10.


Jon*_*ski 6

那么为什么在范围链中a = 10超前= 100?

不是.您只定义了1个a变量,只是在被警告之前被更改10010.

如果您希望as是具有自己值的不同变量,则它们都需要一个var关键字:

var a = 100
function afunc(infunc){
  var a = 10;
  infunc.call();
}

afunc(function(){alert(a)})?
Run Code Online (Sandbox Code Playgroud)