在MDN上的定義爲:函數和對其周圍環境的引用捆綁在一塊兒構成閉包,可讓使用者從函數內部訪問外部函數的做用域。閉包
所以,閉包能夠通俗的理解爲:函數與函數內部能訪問到的變量的總和。函數
形如code
function funA(){ var a = 10; return function(){ console.log(a) } } var b = funA(); b();
其做用就是閉包存在的意義。內存
首先,JS和其餘語言同樣,擁有做用域,其最大的做用就是隔離變量。而且做用域存在上下級關係,由函數是在哪一個做用域下建立所肯定。作用域
變量取值的過程是先在當前做用域查找值,若是沒有則會跳轉到上級做用域查找,若是找到就中止,未查找到這繼續查找上級做用域直到全局做用域中。io
var a = 10; function fn(){ var b = 20; function bar(){ console.log(a + b) } return bar } var x = fn(), b = 200; x() //值爲10+20=30
變量取值的過程就像一個單向鏈表,只能從當前做用域開始向上級做用域查找,所以咱們也將這個查找過程稱爲做用域鏈。console
從上面能夠看到,函數內部能夠訪問到外部的變量,而外部沒法訪問到內部做用域的變量。因此在某些狀況下,咱們不想某個變量直接暴露,就將這個變量保存在函數中,使其變爲局部變量,再使用閉包將其「間接暴露」。function
(function countNum(){ var num = 0; window.addNUm = function (){ num++; console.log(num) } window.reduceNum = function (){ num--; console.log(num) } }())
在這個例子中,要想改變num的值,只能經過addNum
和reduceNum
兩個函數。變量