1. 程式人生 > >for循環,定時器,閉包。

for循環,定時器,閉包。

logs tool 大於 con i++ ddc 時間設置 timeout 一個

1,對於一個基本的for循環,順序輸出變量值。

        for(var i = 0; i < 4; i++){
            console.log(i);//結果不多說了吧
        }

2,如果for循環中有定時器,如下代碼。

        for (var i = 0; i < 5; i++) {
            setTimeout(function() {
                console.log(i);
            }, 1000*i);
        }

setTimeout 會延遲執行,那麽執行到 console.log 的時候,其實 i 已經變成 5 了,開始輸出一個 5(1000*0),然後每隔一秒再輸出一個 5,一共 5 個 5。”

3,如果要得到每一秒輸出i的正確結果,就要引入閉包來保存變量i不被銷毀。

    
  for (var i = 0; i < 5; i++) {
    (function(i) {
      setTimeout(function() {
        console.log(i);
      }, i * 1000);
    })(i);
  }

4,如果要實現,每隔3s輸出一個數字,即,3s輸出1,3s後再輸出2...,就要對定時器時間設置

        for (var i = 0; i < 4; i++) {
            (function(a) {
                setTimeout(function() {
                    console.log(a);
                }, a*3000); //.....
            })(i)
        }

實際上,for循環很快,上述代碼類似於同時啟動3個定時器,只需要確保時間不一樣即可。在此,時間分別是3s,6s,9s,由於同時啟動,但是執行時間不同,各個時間間隔都是3s。巧妙地達到了目的。

案例4的實際用處如下:

  for (var i = 0; i < 1000; i++) {
    (function(a) {
      setTimeout(function() {
        console.log(a);
        $(‘#div1‘).removeClass().addClass(‘r‘+a);
        $(‘#div1‘).html(a);
      }, a*60);
    })(i)
  }

但是在數字大於5位數的時候,明顯會有卡頓甚至引起瀏覽器奔潰。

for循環,定時器,閉包。