Strictモードでは禁止されていますが、これは興味深いやり方ですね。|3以上の結果はクロージャによる動作です。簡単にいうと、ある関数の実行中に出てくる変数はたとえその中の関数で使われても、結局はどこにあっても同じ変数です。setTimeoutの中のiはsetTimeout外側のiと全く同じ変数です。外側のiの値が変われば、内側のiの値も変わってきます。setTimeoutに渡している関数はforループが終わったあとに実行されます。実行されたら、その時点のiの値が表示されます。forループが終わったら、iの値は5なので、5が5回表示されます。思い通りに0,1,2,3,4を表示するには、いくつかの方法があります。一つの方法は、別の関数を呼び出して、新しい変数を作ることです。}}printFive();jsfiddlemakePrintValueが呼び出される度に新しいvalueという変数が生成され、その変数を使う関数が返されます。iの値が変わっても、そのvalueの値は変わりません。ひとつの方法はbindを使うことです。console.log(value);}printFive();jsfiddlebindとは、関数を実行せずに前もって引数を渡して新しい関数を作り出すメソッドです。その時点で渡した値がキープされるので、iの値が変わっても、すでに渡した値に影響はありません。|1ちょっと時間が経っていますが、js使うならやっぱり再帰はちゃんと使えた方がいいと思うので再帰を使ったサンプルコードを貼らせて貰います。これなら同時に動いているsetTimeoutはある時点では一つしかないので止めたりするのも楽です。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。関連する質問3javascriptの配列のundefinedをゼロで埋めたい4Node.jsのコールバックの連鎖の中でメモリ解放を行う方法1console.logとdocument.write02次元配列にすると要素がNaNになってしまう0dropzone.js(ドラッグ&ドロップでのアップロード)が上手く動作しません。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。