私はforループでsetTimeoutを実行している問題に直面しています。 Iが出力javascriptのforループとタイムアウト関数
4期待
for (var x = 0; x < 5; x++) { var timeoutFunction = function() { return function() { console.log(x) } } setTimeout(timeoutFunction(), 1) }
しかし、何らかの理由で、彼らはすべての出力5.
変数x
は、forループのローカルスコープで定義されているので、私は、これはsetTimeoutメソッドのコールバックのためにカウントされないことがあり思いました。私はforループの外にx
を定義してテストしました。
var x = 10
for (var x = 0; x < 5; x++) {
var timeoutFunction = function() {
return function() {
console.log(x)
}
}
setTimeout(timeoutFunction(), 1)
}
私は、この出力は10を与えることになる考え出し、まだそれはしませんでした。その後、xを定義することが理にかなっていると思いました。
for (var x = 0; x < 5; x++) {
var timeoutFunction = function() {
return function() {
console.log(x)
}
}
setTimeout(timeoutFunction(), 1)
}
var x = 10
これが唯一の10。これは、コールバックは、すべてのforループの後に呼ばれている意味が実行されて返されていますか?そして、for-loopの実行後に変数が初期化されると、なぜfor-loopの親スコープにしか準拠しないのですか?何か不足していますか?
私はあなたがあなたの関数のための新しいスコープを作成する必要が
すばらしい例とリンクをありがとう!最初は、閉鎖に関する発言を完全に理解することができませんでした。参照はより明確になり、あなたが意味するものを正確に理解しました:) "これは、割り当てられた関数がクロージャであり、関数の定義と関数のスコープのキャプチャされた環境で構成されているためです。ループによって作成されますが、それぞれが値が「x」の変数を持つ単一の環境を共有していますsetTimeoutコールバックが実行されると、その時点で「x」にアクセスするとこの動作が発生します " – jervtub
@jervtub閉鎖は、通常、あなたの心を掴むために、より厳しいものの一つであり、彼らは理解するために少しの練習を取る。答えとして記入することを忘れないでください。がんばろう! –