閉包的兩個經典例子
阿新 • • 發佈:2019-02-10
for (var i = 0; i < 5; ++i) {
setTimeout(function () {
console.log(i + ' ');
}, 100);
}
不能輸出正確結果,因為迴圈中setTimeout接受的引數函式通過閉包訪問變數i。javascript執行環境為單執行緒,setTimeout註冊的函式需要等待執行緒空閒才能執行,此時for迴圈已經結束,i值為5.五個定時輸出都是5 修改方法:將setTimeout放在函式立即呼叫表示式中,將i值作為引數傳遞給包裹函式,建立新閉包
for (var i = 0; i < 5; ++i) { (function (i) { setTimeout(function () { console.log(i + ' '); }, 100); }(i)); }
2.function add(){var x=1; console.log(++x);}
add();//執行輸出2,
add();//執行還是輸出2,
怎樣才能使每次執行有加1效果呢?使用閉包
function add(){var x=1;return function(){console.log(++x);};
var num=add();
num();//輸出2,
num();//輸出3,
num();//輸出4,
依次.....就實現了加1效果.