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

循環中的閉包 一個常見的錯誤出如今循環中使用閉包,假設咱們須要在每次循環中調用循環序號閉包

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匿名函數

相關文章
相關標籤/搜索