考虑以下示例:
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。