這個問題其實在問:閉包
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'
只有 getName
和 setName
兩個函數能夠訪問,外部沒法訪問,相對於將變量私有化。function