講道理看了Javascript高級程序設計對比包的解釋,終于有點對閉包稍微有點概念了平委。
作者的觀點是只要在一個函數(shù)中定義了其ta函數(shù)奈虾,就創(chuàng)建了閉包。而閉包有權訪問包含閉包的函數(shù)作用域廉赔。
這里個人的理解是函數(shù)A內(nèi)定義的那個函數(shù)Aa肉微,這個Aa在函數(shù)A內(nèi)部定義,擁有了自己的作用域蜡塌、包含閉包的函數(shù)A的作用域以及全局作用域碉纳。而閉包只要不被銷毀,自然可以一直保存包含閉包的函數(shù)A的作用域馏艾。
function A(){
let count = 0;
function Aa(){
return count++;
}
return Aa;
}
const B = A();//將閉包函數(shù)Aa扔給B
console.log(B(), B(),);//0 1
這里加上作用域鏈的解釋可能我覺得可能更容易理解哇劳曹。每個函數(shù)都有一個執(zhí)行環(huán)境奴愉,內(nèi)部包含了一個相關的變量對象(變量對象內(nèi)部是當前執(zhí)行環(huán)境的所有變量和方法)。代碼在一個環(huán)境中執(zhí)行時铁孵,會創(chuàng)建變量對象的一個作用域鏈锭硼。在上文閉包Aa執(zhí)行時,作用域鏈中依次包含了當前Aa的變量對象——外部A的變量對象——全局環(huán)境的變量對象蜕劝。也就是說函數(shù)A執(zhí)行完畢后檀头,雖然A的執(zhí)行環(huán)境被銷毀了,但是Aa中還保存了A的變量對象岖沛,除非閉包Aa也被銷毀了鳖擒。這就解釋了代碼中調(diào)用三次B函數(shù),每次count變量的值都被保存在了內(nèi)存中烫止。
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
因此更改代碼蒋荚,將閉包銷毀后再啟用,內(nèi)存中的count就被回收了馆蠕。