一、闭包
实现可重用的局部变量,且保护其不受污染的机制。
- 外层函数包裹受保护的变量和内层函数。
- 内层函数专门负责操作外层函数的局部变量。
- 将内层函数返回到外层函数外部,反复调用。
二、作用域
子函数会一级一级地向上寻找所有父函数的变量。所以,父函数的所有变量,对子函数都是可见的,反之则不成立。
三、函数调用
- 外层函数调用了几次,就有几个受保护的局部变量副本。
- 同一次外层函数调用返回的多个内层函数,共同用一个局部变量。
- 闭包的局部变量不能释放。
- 尽量不要在定时器中使用闭包。因为闭包的外层函数定义的变量不能释放,但是定时器使用中需要释放。
四、内层函数使用不同变量的实例详解
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