0
JavaScriptにコードがあります。私はa[2]()
を呼び出す場合機能範囲を理解する
var a = [];
for (var i = 0; i < 5; i++) {
a[i] = function() {
alert(i);
};
}
a[2]();
私は2
でメッセージを見ることを期待これに代えて、私は5
を参照してください。
for (var i = 0; i < 5; i++) {
(function (v) {
a[i] = function() {
alert(v);
}
})(i)
}
しかし、私はそれが動作しない方法を理解することはできません。だからなぜ私の関数コードを閉じてラップする必要がありますか?
他の言語に反し、* JSでfor'文 '内には暗黙のスコープはありません。*匿名関数は、他の一方で、自分のスコープを持っており、外側の地元の人々をキャプチャし、そのため関数内にループ本体をラップし、すぐに呼び出すことで問題が解決されます。 –
この場合、* i *はグローバルであることにも注意してください。 – RobG
@RobG、外側の範囲に。私たちはそれが何であるかはわかりません。それはグローバルスコープでも、機能内でも、別のクロージャでもかまいません。 –