闭包
我们把函数执行,形成私有上下文,来保存和保护私有变量的机制,称之为“闭包” =>它是一种机制
函数执行会形成全新的私有上下文,这个上下文可能被释放,也可能不被释放,不论是否被释放,它的作用是
1. 保护
划分一个独立的代码执行区域,在这个区域中有自己私有变量存储的空间,而用到的私有变量和其它区域中的变量不会有任何的冲突(防止全局变量污染)
2. 保存
如果上下文不被销毁,那么存储的私有变量的值也不会被销毁,可以被其下级上下文中调取使用
两种闭包说法
市面上一般认为只有形成的私有上下文不被释放,才算是闭包(因为如果一但释放,之前的东西也就不存在了);
还有人认为,只有一下级上下文用到了此上下文中的动西才算闭包;
let x = 1;
function A(y){
let x = 2;
function B(z){
console.log(x+y+z);
}
return B;
}
let C = A(2);
C(3) // => 7
分析:
EC(G) 全局上下文
- C 中保存EC(B)的地址,所以EC(B)不会被释放
EC(A) 函数A的私有上下文
- 返回EC(B)的地址
EC(B) 函数B的私有上下文
C(3)执行完会被释放 但是C不会