闭包
简单来说,闭包是指可以访问另一个函数作用域变量的函数,一般是定义在外层函数中的内层函数。
为什么需要闭包
局部变量无法共享和长久的保存,而全局变量可能造成变量污染,所以我们希望有一种机制既可以长久的保存变量又不会造成全局污染。
特点
占中更多内存
不容易被释放
何时使用
既想反复使用,又想避免全局污染。
如何使用
1.定义外层函数,封装被保护的局部变量。
- 定义内层函数,执行对外部函数变量的操作。
- 外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。
函数生命周期
要记住函数对象、作用域链对象、执行环境(EC)和活动(AO)这几个东西都什么时候出现,什么时候消失。
例子:
看此函数,函数对象的地址仅作标识不代表真实的地址
var getNum;
function getCounter () {
var n = 1;
var inner = functionn () {
return n ++ ;
}
return inner;
}
getNum = getCounter();
console.log(getNum());
console.log(getNum());
程序运行到2的时候:
运行到程序3的时候:
运行到4的时候,外层函数调用结束,AO对象释放,图中红线断了;
4处的代码执行时:
4处的代码执行完:
总结:可以看到内层函数对象被全局变量getNum引用和外层函数的AO对象引用,外层函数的AO对象,内层函数本身的作用域对象在函数调用完都无法被内存回收,因此占用了更多的内存空间,但是这样持久的保存了需要的n。
来源:https://zhuanlan.zhihu.com/p/27857268