你還理解閉包嗎?Do you understand of closures ?

理解閉包嗎?

這個問題其實在問:閉包

  1. 閉包是什麼?
  2. 閉包有什麼做用?

閉包是什麼

MDN的解釋:閉包是函數和聲明該函數的詞法環境的組合。函數

按照個人理解就是:閉包 =『函數』和『函數體內可訪問的變量總和』this

舉個簡單的例子:代理

(function() {
    var a = 1;
    function add() {
        var b = 2

        var sum = b + a
        console.log(sum); // 3
    }
    add()
})()

add 函數自己,以及其內部可訪問的變量,即 a = 1,這兩個組合在一塊兒就被稱爲閉包,僅此而已。code

閉包的做用

閉包最大的做用就是隱藏變量,閉包的一大特性就是內部函數老是能夠訪問其所在的外部函數中聲明的參數和變量,即便在其外部函數被返回(壽命終結)了以後ip

基於此特性,JavaScript能夠實現私有變量、特權變量、儲存變量等get

咱們就以私有變量舉例,私有變量的實現方法不少,有靠約定的(變量名前加_),有靠Proxy代理的,也有靠Symbol這種新數據類型的。io

可是真正普遍流行的實際上是使用閉包。console

function Person(){
    var name = 'cxk';
    this.getName = function(){
        return name;
    }
    this.setName = function(value){
        name = value;
    }
}

const cxk = new Person()

console.log(cxk.getName()) //cxk
cxk.setName('jntm')
console.log(cxk.getName()) //jntm
console.log(name) //name is not defined

函數體內的 var name = 'cxk' 只有 getNamesetName 兩個函數能夠訪問,外部沒法訪問,相對於將變量私有化。function

相關文章
相關標籤/搜索