循環中的閉包 一個常見的錯誤出如今循環中使用閉包,假設咱們須要在每次循環中調用循環序號閉包
for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 1000); }
上面的代碼不會輸出數字 0 到 9,而是會輸出數字 10 十次。函數
當 console.log 被調用的時候,匿名函數保持對外部變量 i 的引用,此時 for循環已經結束, i 的值被修改爲了 10.post
爲了獲得想要的結果,須要在每次循環中建立變量 i 的拷貝。code
避免引用錯誤get
爲了正確的得到循環序號,最好使用 匿名包裹器(譯者注:其實就是咱們一般說的自執行匿名函數)。io
for(var i = 0; i < 10; i++) { (function(e) { setTimeout(function() { console.log(e); }, 1000); })(i); }
外部的匿名函數會當即執行,並把 i 做爲它的參數,此時函數內 e 變量就擁有了 i 的一個拷貝。console
當傳遞給 setTimeout 的匿名函數執行時,它就擁有了對 e 的引用,而這個值是不會被循環改變的。for循環
有另外一個方法完成一樣的工做;那就是從匿名包裝器中返回一個函數。這和上面的代碼效果同樣。function
for(var i = 0; i < 10; i++) { setTimeout((function(e) { return function() { console.log(e); } })(i), 1000) }
轉載自:http://www.9958.pw/post/js_bibao匿名函數