経典の閉包問題
5274 ワード
経典の閉包問題
こんにちはjsを勉強していますが、閉包の問題がよくありますので、分かりにくいです.次は小さい判例を使って図形に合わせて原理を説明します.皆さんの勉強に役に立ちたいです.
コードは以下の通りです
この時は0 1、2、3を出力しますが、どう解決すればいいですか?
プランは以下の通りです
画像解析:
作者:葉剛
こんにちはjsを勉強していますが、閉包の問題がよくありますので、分かりにくいです.次は小さい判例を使って図形に合わせて原理を説明します.皆さんの勉強に役に立ちたいです.
コードは以下の通りです
for(var i=0;i<5; i++){
setTimeout(function(){
console.log(i,(new Date).toLocaleString())
},1000*i);
}
forサイクル部分とsetTimeout consolist.logは同期イベントで、funcition(){}、1000*iは非同期操作なので、先に非同期動作の部分をタスクキューに預けてから同期動作を行う部分をポーリングする.(event loopモニター)それを読む時間は1000ミリ秒で終わったら、メインスレッドにその非同期操作部分を戻すように通知します.この時は0 1、2、3を出力しますが、どう解決すればいいですか?
プランは以下の通りです
//
for(i=0;i<5;i++)
{
(function(i){
setTimeout(function(){
console.log(i);
},1000);
})(i);
} // 0 1 2 3 4
//
for(i=0;i<5;i++)
{
setTimeout(function(i){
console.log(i);
},1000,i)
} // 0 1 2 3 4
SetTimeoutには2つのパラメータがあります.1番目のパラメータはコールバック関数、2番目のパラメータはミリ秒数です.コールバック関数を実行するには遅延する時間を表します.しかし、デフォルトは最後のIdに戻ります.まず、5つのタイマーが印刷したのは同じi変数ですので、異なる数字を出力するためには、タイマーごとにアクセスする変数を独立させる必要があります.これはJavaScriptのクローズドに使われています.クローズドの用途が多く、地域ごとに機能領域を分離して変数の混淆を避けることができます.ただし、クローズドを乱用することで、性が起こります.問題があります.では、下の修正を通じて大丈夫です.画像解析:
作者:葉剛