讲道理看了Javascript高级程序设计对比包的解释,终于有点对闭包稍微有点概念了。
作者的观点是只要在一个函数中定义了其ta函数,就创建了闭包。而闭包有权访问包含闭包的函数作用域。
这里个人的理解是函数A内定义的那个函数Aa,这个Aa在函数A内部定义,拥有了自己的作用域、包含闭包的函数A的作用域以及全局作用域。而闭包只要不被销毁,自然可以一直保存包含闭包的函数A的作用域。
function A(){
let count = 0;
function Aa(){
return count++;
}
return Aa;
}
const B = A();//将闭包函数Aa扔给B
console.log(B(), B(),);//0 1
这里加上作用域链的解释可能我觉得可能更容易理解哇。每个函数都有一个执行环境,内部包含了一个相关的变量对象(变量对象内部是当前执行环境的所有变量和方法)。代码在一个环境中执行时,会创建变量对象的一个作用域链。在上文闭包Aa执行时,作用域链中依次包含了当前Aa的变量对象——外部A的变量对象——全局环境的变量对象。也就是说函数A执行完毕后,虽然A的执行环境被销毁了,但是Aa中还保存了A的变量对象,除非闭包Aa也被销毁了。这就解释了代码中调用三次B函数,每次count变量的值都被保存在了内存中。
function A(){
let count = 0;
function Aa(){
return count++;
}
return Aa;
}
let B = A();
console.log(B());//0
B = null;
B = A();
console.log(B());//0
因此更改代码,将闭包销毁后再启用,内存中的count就被回收了。