閉包,官方解釋:一個擁有許多變量和綁定了這些變量的環境的表達式,一般是一個函數,於是這些變量也是該表達式的一部分。javascript
抽象,難以理解,再普通一點來講,就是函數返回函數。java
找一個最簡單的例子:瀏覽器
function a(i) { function b(j) { return i+j; } return b; } var add = a(1); alert(add(5));
執行的結果是彈出6;閉包
變量add中存放的是函數b,由於再函數a中返回值爲b,而且b沒有加括號。函數
add的內容是:blog
function b(j) { return i+j; }
原始的代碼中先定義了一個a函數,在a函數中又定義了一個b函數,而且在b函數中使用了a函數中的i這個參數,而後調用了a(1),讓add引用了a函數中返回的內嵌函數b,a(1)的功能是將一個數字加1,這這時又調用了add(5),至關於已經綁定了變量i,而且將i的值賦值爲了1,以後調用了add(5),即將變量j賦值爲5,執行以後就是1+5,因此add(5)的結果就是6.ip
因此Js中閉包的產生條件:作用域
上面的例子中,嵌入函數b使用了局部變量i,外部函數a引用了內嵌函數b;io
可是,若是內嵌函數中沒有使用外部函數的局部變量,那麼就沒有必要綁定定義時環境中的變量,瀏覽器也是這樣實現的,再者,若是外部變量沒有引用內嵌函數,則內嵌函數被垃圾回收,造成的閉包也會沒法使用。因此須要看一下閉包實現的原理。function
Js閉包中綁定定義時環境中的變量是經過js的函數做用域鏈實現的,要理解閉包的原理,先要理解js函數的做用域鏈。由於我本身學的還不是很深,對於閉包的原理理解的也還不夠,因此只能寫一點簡單的用法,和本身的一點理解,這也是參照了一些前輩的經驗總結出來的。
另外在Js閉包的應用方面,主要是多用來封裝和保存現場。