一、閉包
實現可重用的局部變量,且保護其不受污染的機制。
- 外層函數包裹受保護的變量和內層函數。
- 內層函數專門負責操作外層函數的局部變量。
- 將內層函數返回到外層函數外部,反復調用。
二、作用域
子函數會一級一級地向上尋找所有父函數的變量。所以,父函數的所有變量,對子函數都是可見的,反之則不成立。
三、函數調用
- 外層函數調用了幾次,就有幾個受保護的局部變量副本。
- 同一次外層函數調用返回的多個內層函數,共同用一個局部變量。
- 閉包的局部變量不能釋放。
- 盡量不要在定時器中使用閉包。因為閉包的外層函數定義的變量不能釋放,但是定時器使用中需要釋放。
四、內層函數使用不同變量的實例詳解
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