js 閉包的用法詳解


一、閉包

實現可重用的局部變量,且保護其不受污染的機制。

  1. 外層函數包裹受保護的變量和內層函數。
  2. 內層函數專門負責操作外層函數的局部變量。
  3. 將內層函數返回到外層函數外部,反復調用。

二、作用域

子函數會一級一級地向上尋找所有父函數的變量。所以,父函數的所有變量,對子函數都是可見的,反之則不成立。

三、函數調用

  1. 外層函數調用了幾次,就有幾個受保護的局部變量副本。
  2. 同一次外層函數調用返回的多個內層函數,共同用一個局部變量。
  3. 閉包的局部變量不能釋放。
  4. 盡量不要在定時器中使用閉包。因為閉包的外層函數定義的變量不能釋放,但是定時器使用中需要釋放。

四、內層函數使用不同變量的實例詳解

1、內層函數使用自己的變量

內層函數使用自己的變量,調用完后,直接釋放。

function outerFun(){
    function innerFun(){
        var innerVar = 0;
          innerVar++;
        alert(innerVar);
    }
    return innerFun;
}
var globVar1 = outerFun();
globVar1();        // Alert 1
globVar1();        // Alert 1
var innerVar2 = outerFun();
innerVar2();    // Alert 1
innerVar2();    // Alert 1

2、內層函數使用全局變量

全局變量釋放,是在所有代碼運行完成后。

var globVar = 0;
function outerFun(){
    function innerFun(){
        globVar++;
        alert(globVar);
    }
    return innerFun;
}
var globVar1 = outerFun();
globVar1();  // Alert 1
globVar1();  // Alert 2
var globVar2 = outerFun();
globVar2();  // Alert 3
globVar2();  // Alert 4

3、內層函數使用外層函數變量(閉包)

  • 外層函數調用幾次就有幾個被保護的局部變量副本。
  • 閉包的局部變量不被釋放。
function outerFun(){
    var outerVar = 0;
        function innerFun(){
        outerVar++;
        alert(outerVar);
     }
    return innerFun;
}
var globVar = outerFun();
globVar();  // Alert 1
globVar();  // Alert 2
var globVar2 = outerFun();
globVar2();  // Alert 1
globVar2();  // Alert 2

 


免責聲明!

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



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