スクリプトです:奇妙な結果
for(var i = 0; i < 5; i++) {
setTimeout(function() { console.log(i); }, 0);
};
コンソールで理論的には、出力すべきちょうど5「5」。しかし、Chrome、Opera、またはSafariのコンソールで実行すると、奇妙な数字が残っています。 OSはmacOS Sierra 10.12.1です。
など。
クローム54.0.2840.98(64ビット):
for(var i = 0; i < 5; i++) {
setTimeout(function() { console.log(i); }, 0);
};
2105
⑤ 5
サファリ10.0.1:
> for(var i = 0; i < 5; i++) {
setTimeout(function() { console.log(i); }, 0);
};
< 6
> for(var i = 0; i < 5; i++) {
setTimeout(function() { console.log(i); }, 0);
};
< 11
> for(var i = 0; i < 5; i++) {
setTimeout(function() { console.log(i); }, 0);
};
< 16
オペラ39.0:
for(var i = 0; i < 5; i++) {
setTimeout(function() { console.log(i); }, 0);
};
5
⑤ 5 VM73:2
for(var i = 0; i < 5; i++) {
setTimeout(function() { console.log(i); }, 0);
};
10
⑤ 5 VM74:2
あなたはそれを自分で試みることができます。興味深いのは、HTMLページに含まれる同じコードが必要なように動作することです。コンソールが開いているタブによって、番号が異なります。それは何ですか?サイクルのための何らかの内部カウンタを推測しますが、わかりません。別の考え方 - コンソールは、関数の戻り値を実行するものを示します。おそらくそれはそうです。しかし、for
は何も返しません。少なくともそれはすべきではない。同じコードだが、setTimeout
がないと、奇妙な数字の代わりにundefined
が表示されます。たぶん誰かがそれについて私とインターネットよりも少し知っています。どんな考えも高く評価されています。私の英語には申し訳ありません。ありがとうございました!
同じスコープ内の変数を制限するために 'var'の代わりに' let'を使用してください。 – Endless
[ループ内のJavaScriptクロージャーの可能な複製 - 簡単な実用的な例](http://stackoverflow.com/questions/750486/) – Endless
クロムとオペラの例では、2105は 'setTimeout'コールの結果として得られる最後のタイマーです。 「⑤5」は、「5」という数字が明らかに5回出力されたことを意味する。 SafariはタイマーIDも表示しているようですが、なぜiが出力されないのかわかりませんが、おそらくコンソール設定の問題です。 –