私は以下のコードを説明するために、なぜそれが意図したとおりに動作しませんどのように理解していない。これにのsetTimeoutコールバックExplination
for (var i = 0; i < 16; i++) {
setTimeout(function() {
console.log(i);
}, 1)
}
// Prints "16" 16 times
一つの解決策は単純にforループでlet
代わりのvar
を使用することになり、または
for (var i = 0; i < 16; i++) {
(function (k) {
setTimeout(function() {
console.log(k);
}, 100)
})(i)
}
// Print "0" to "15"
自己呼び出し機能です。
もし私がこれを知っているとすれば、varのスコープが関数ブロックに結びついているか、グローバルスコープとforループがsetTimeout()
が生成するコールスタックを上回るJavascriptはレキシカルスコープであり、var i = 16
のようにこれらの関数をすべてコールします。一方、let i = 16
はそれをブロックに保持しますか?
'setTimeout'は' i'が16のループの後に*を実行します。 – Li357
[閉鎖の仕組み]を参照してください(http://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Rajesh