返回首頁
當前位置: 主頁 > 網絡編程 > Jsp實例教程 >

js閉包,解決for循環變量未定義等類似問題

時間:2018-11-05 23:22來源:知行網www.wtckvq.live 編輯:麥田守望者

循環中的閉包 一個常見的錯誤出現在循環中使用閉包,假設我們需要在每次循環中調用循環序號
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}

上面的代碼不會輸出數字 0 到 9,而是會輸出數字 10 十次。

當 console.log 被調用的時候,匿名函數保持對外部變量 i 的引用,此時 for循環已經結束, i 的值被修改成了 10.

為了得到想要的結果,需要在每次循環中創建變量 i 的拷貝。

避免引用錯誤

為了正確的獲得循環序號,最好使用 匿名包裹器(譯者注:其實就是我們通常說的自執行匿名函數)。
for(var i = 0; i < 10; i++) {
(function(e) {
setTimeout(function() {
console.log(e);
}, 1000);
})(i);
}

外部的匿名函數會立即執行,并把 i 作為它的參數,此時函數內 e 變量就擁有了 i 的一個拷貝。

當傳遞給 setTimeout 的匿名函數執行時,它就擁有了對 e 的引用,而這個值是不會被循環改變的。

有另一個方法完成同樣的工作;那就是從匿名包裝器中返回一個函數。這和上面的代碼效果一樣。
for(var i = 0; i < 10; i++) {
setTimeout((function(e) {
return function() {
console.log(e);
}
})(i), 1000)
}

------分隔線----------------------------
標簽(Tag):Node.js
------分隔線----------------------------
推薦內容
猜你感興趣
深蓝海域APP dnf大转移后副职业那个最赚钱 开儿童手工玩具店赚钱吗 跳舞赚钱好吗 仙境传说ro刺客如何赚钱 2018西安滴滴能赚钱吗 游戏职业联赛怎么赚钱 那些看新闻赚钱的软件 如何利用人们的怀旧心理赚钱 种植什么风景树赚钱 dnf哪个副职业赚钱2015 未成年人网上赚钱方法 手机代工厂赚钱吗 团队聊天赚钱 服务器攥赚钱 spa技师赚钱吗 海济生物公司赚钱制度