次の例を考えてみましょう。
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の値をログに記録する2つの関数を次々に呼び出しますa。この場合、両方の関数がの値として10をログに記録することを期待しますがa、実際にはそれが発生します。
あなたの例では、実際に定義された場所に関係なく、でinfunc定義されたローカル関数と本質的に同じスコープで実行されます。より狭い範囲でafunc値を割り当てたので、それはを呼び出すときの値です。aainfunc
次の例のように、関数はその定義からある程度のスコープを保持します。
function bfunc(){
var b = 'hello';
return function (){ console.log(b); };
}
afunc(bfunc());
ここで、によって返される無名関数は、bfunc実際にはのスコープ内から呼び出されますが、元のスコープで割り当てられたafuncの正しい値をログに記録することは可能です。に別の値を割り当てるbように変更した場合でも、で定義されたはで定義されたものとは異なる変数であるため、ログに記録されます。afuncb"hello"bafuncbbfunc