JS中的閉包是一個咱們常常遇到的名詞,到底什麼是閉包?爲何咱們要使用閉包?又該如何使用閉包呢?javascript
首先來看一個例子,咱們來實現一個計數器。java
var counter = 0; function add() { return counter += 1; } add(); add(); add();// 計數器如今爲 3
如今咱們已經達到了目的,但是問題來了,代碼中的任何一個函數均可以隨意改變counter
的值,因此這個計數器並不完美。那咱們把counter
放在add
函數裏面不就行了麼?閉包
function add() { var counter = 0; return counter += 1; } add(); add(); add();// 本意是想輸出 3, 但輸出的都是 1
因此這樣作的話,每次調用add
函數,counter
的值都要被初始化爲0,仍是達不到咱們的目的。函數
因此這時候咱們就要用閉包去解決這個問題了,先看代碼。code
var add = (function () { var counter = 0; return function () {return counter += 1;} })(); add(); add(); add();// 計數器爲 3
這時候咱們完美實現了計數器。這段很是精簡,能夠拆分紅以下等價代碼。ip
function outerFunction () { var counter = 0; function innerFunction (){ return counter += 1; } return innerFunction; } var add = outerFunction(); add(); add(); add();// 計數器爲 3
這時候的add
就造成了一個閉包。一個閉包由兩部分組成,函數和建立該函數的環境。環境是由環境中的局部變量組成的。對於閉包add
來講,它由函數innerFunction
和變量counter
組成,因此這時候add
是能夠訪問變量counter
的。內存
因此閉包的功能就是使一個函數能訪問另外一個函數做用域中的變量。造成閉包以後,該變量不會被垃圾回收機制回收。作用域
閉包的原理其實仍是做用域。io
使用閉包的優勢是能夠避免全局變量污染,缺點是容易形成內存泄露。function