JS閉包理解

舉一個例子來說明閉包:

function A(){
  var a=0;
  function B(){
      a=a+1;
      console.log(a); 
}
return B;
}
var m=A();
var n=m();

上述代碼中每次執(zhí)行m(),a的值都會加1。

例子的原理

因為上述代碼中當執(zhí)行A()的時候,此時執(zhí)行環(huán)境為函數(shù)A的函數(shù)執(zhí)行環(huán)境,作用域鏈的最前端為A的活動對象,然后是全局變量對象。當函數(shù)A執(zhí)行完畢后,本應該銷毀A的活動對象,但因為返回結果為B,也就是此時全局變量m中保存的是函數(shù)B,所以把函數(shù)B帶入了全局環(huán)境中,但是B的作用域鏈需要引用A,所以A的活動對象并沒有銷毀。當在全局中執(zhí)行B時,此時的作用域鏈依次為B的活動對象,A的活動對象,全局活動對象。

閉包的神奇之處:

外層的函數(shù)執(zhí)行后,本應該銷毀作用域,并且JS的垃圾回收機制將其內(nèi)存空間進行回收,但是閉包阻止了這件事。因為內(nèi)層的函數(shù)在其詞法作用域以外的地方被執(zhí)行,而其內(nèi)層函數(shù)又需要引用外層函數(shù)的作用域,所以外層函數(shù)執(zhí)行后,并沒有銷毀作用域,垃圾回收機制也沒有對內(nèi)存空間進行回收。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容