【js】what is 閉包

什麼是閉包?
MDN給出的官方回答是「閉包是由函數以及建立該函數的詞法環境組合而成。這個環境包含了這個閉包建立時所能訪問的全部局部變量閉包

看代碼函數

//一個函數裏面包含了另外一個函數,最後已返回值返回被包裹的的函數。
function func() {
    let a = 1;
    function closer(){
        console.log(a)
    }
    return closer
}
let b = func()
b() // 1

按照正常的js做用域,當func執行完後a已經被銷燬,可是變量b仍然可以訪問到它裏面的變量。
這就是閉包的核心。當函數執行完後,被做爲返回值函數保留在了做用域中。以致於裏面的數據沒有被銷燬,仍然能夠訪問到。
閉包還有一個做用是模擬私有方法和變量。要知道,js是不支持定義私有方法和變量的。
經過這個類做爲對象返回私有方法和屬性,即可以保證它們只能夠被Create所調用。性能

function Create(){
   var privateCounter = 0;
   function changeBy(val) {
     privateCounter += val;
   }
   return {
        increment: function() {
          changeBy(1);
        },
        decrement: function() {
          changeBy(-1);
        },
        value: function() {
          return privateCounter;
        }
    }   
}

閉包的缺點
由上文可知閉包的做用能夠使數據保存在內存中。當濫用閉包,也會致使內存佔用過多,影響性能code

解決閉包的問題
當你已經肯定某些數據不會再被調用時,能夠把閉包刪除或者設爲null對象

總結
當一個函數可以記住並訪問到其所在的詞法做用域及做用域鏈,特別強調是在其定義的做用域外進行的訪問,此時該函數和其上層執行上下文共同構成閉包內存

相關文章
相關標籤/搜索