js典型題--從閉包開始
阿新 • • 發佈:2017-05-21
變量 傳參 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典型題--從閉包開始