1. 程式人生 > >閉包的兩個經典例子

閉包的兩個經典例子

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效果.