闭包

109 阅读1分钟

闭包

我们把函数执行,形成私有上下文,来保存和保护私有变量的机制,称之为“闭包” =>它是一种机制

函数执行会形成全新的私有上下文,这个上下文可能被释放,也可能不被释放,不论是否被释放,它的作用是

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不会