次の例を考えてみましょう。
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
値を割り当てたので、それはを呼び出すときの値です。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