js閉包及問題的解決


  • 閉包定義,作用

    閉包就是能夠讀取其他函數內部變量的函數。

    作用:一個是可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中

    缺點:閉包會保存函數中的變量在內存中,導致內存消耗大

           閉包會在父函數外部改變父函數內部變量的值

  • 閉包與異步執行函數

   前端使用異步執行的情況有

    a  定時任務:setTimeOut() setInterval()

    b  網絡請求:ajax請求 動態<img>加載

    c  時間綁定

  當遇到異步的情況時,函數的輸出結果:

    for(var i = 1; i <= 5;i++){

      setTimeout(function timer(){

        console.log( i );

      },i * 1000);

    } //輸出結果是6 6 6 6 6 6

  因為,當執行setTimeOut()時,會暫時跳過這一段,放在緩沖區,當for循環執行結束之后,由於i是全局變量,此時在執行console.log( i )就會是 6,而不是預期中的0 1 2 3 4 5,解決辦法通常有兩種一是使用ES6中let使for循環中的變量變成塊兒作用域,二就是使用立即執行函數,通過函數作用域可以保存變量的特性來將每次循環的變量 i 保存到函數中。

  使用let:

    for( let i = 0; i <= 5; i++){

      setTimeout( function timer(){

        console.log( i );

      },i * 1000);

    }// 輸出結果 0 1 2 3 4 5

  使用立即執行函數(IIFE):

    for(var i = 0; i <= 5; i++){

      (function(){

        var j = i;

        setTimeout( function timer(){

          console.log( j );

        }, j * 1000);

      })();

    }//輸出結果0 1 2 3 4 5

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM