考虑以下示例:
var a = 100;
function afunc(infunc){
a = 10;
var f = function (){
console.log(a);
};
f.call();
infunc.call();
}
afunc(function (){ console.log(a); });
a
我们在 的范围内赋值 10 afunc
,然后依次调用两个函数来简单地记录 的值a
。在这种情况下,您会期望两个函数都将 10 记录为 的值a
,而这实际上就是发生的情况。
在您的示例中,infunc
将在与 中定义的任何本地函数基本相同的范围内执行afunc
,而不管它实际定义的位置。由于您a
在更窄的范围内分配了一个值,这就是a
您调用infunc
.
函数确实从它们的定义中保留了一些范围,如下例所示:
function bfunc(){
var b = 'hello';
return function (){ console.log(b); };
}
afunc(bfunc());
在这里,返回的匿名函数bfunc
实际上是在 范围内调用的afunc
,但它仍然能够记录b
在原始范围内分配的正确值。如果您要更改afunc
为 分配不同的值b
,它仍然会记录"hello"
,因为b
定义afunc
的变量与b
定义的变量不同bfunc
。