1. 程式人生 > >js典型題--從閉包開始

js典型題--從閉包開始

變量 傳參 settime lex 機制 details tail logs out

一個不起眼的開始

 for(var i=0;i<5;i++){
       setTimeout(function () {
           console.log(i)
       },1000)
   }
console.log(i)
//5     5,5,5,5,5

  這裏涉及到javascript的單線程異步機制,詳細介紹見 http://blog.csdn.net/alex8046/article/details/44494859

  javascrip是單線程語言,所有異步事件(計時器、鼠標事件、ajax...)在所有時間執行完畢之後才能執行,並且單線程事件幾乎在同一時間內執行完畢,因此,在for循環結束後,i已經變為5,而settimeout事件在1秒之後輸出5個5。

如果希望輸出值變為 5 0,1,2,3,4 改如何進行改進?

1.閉包,將變量保存

for(var i=0;i<5;i++){
        (function (j) {   //閉包,j=i
            setTimeout(function () {
                console.log(j)
            },1000)
        })(i)
    }
console.log(i)

2.循環體內進行函數傳參,保留變量

 var fn=function (i) {
        setTimeout(function () {
            console.log(i)
        },
1000) } for(var i=0;i<5;i++){ fn(i) } console.log(i)

js典型題--從閉包開始