JavaScript的閉包有兩個用途:一個是訪問函數內部的變量;另外一個是讓變量的值在做用域內保持不變。函數是JavaScript 中惟一有做用域的對象,所以JavaScript的閉包依賴於函數實現,下面結合兩則示例對JavaScript的閉包作簡單說明。閉包
JavaScript中沒有嚴格意義上的類,因此咱們經常使用函數來模擬類。咱們能夠像下面這樣模擬一個Counter類,並在其中定義一個count私有變量:
函數
在JavaScript中,函數能夠訪問其外部定義的變量,而外部不能訪問函數內部定義的變量。要訪問函數內部定義的變量,須要在其內部分定義一個閉包函數,經過調用閉包函數達到訪問函數內部變量的目的。spa
在上面示例中,count至關於一個「私有變量」,在Counter函數外部不能訪問這個變量。在Counter中,還定義了increment 和 get兩個「閉包函數」,這兩個函數都保持着對Counter做用域的引用,所以能夠訪問到Counter做用域內定義的變量count。code
ECMASceript 2015(ES6)以前,JavaScript中沒有塊級變量(ES6中可使用let定義塊級變量),使用var
定義的變量都是全局或函數級變量。對象
在上面的代碼中,咱們指望的依次輸出數字0到9,而實際是輸出是十次10。這是由於JavaScript只有函數級做用域,沒有塊級做用域。要解決這個問題,就要爲變量構建一個做用域。解決方案以下:blog
以上兩種方案都是經過閉包
(匿名函數)實現的,外部函數執行後i
做爲參數傳入,此時函數內e
變量就擁有了i
的一個拷貝。變量傳入匿名函數後至關於有了一個閉包的做用域,而後就獲得了咱們想要的結果。
ip