寫文章以前,查閱了不少的資料,也看了不少大牛對閉包的解釋,如今總算是對閉包有了必定的理解。javascript
可能你會問:明明是講閉包,爲何又講做用域了? 在理解閉包以前咱們首先要明白JavaScript中變量做用域的概念,咱們都知道JavaScript的變量分爲局部變量和全局變量,好比:html
var global = 1; function f1() { var local = 2; console.log(global ) // 1 console.log(local) // 2 } console.log(global ) // 1 console.log(local) // local is not defined
在上面示例中global是全局變量,所以能夠在任何地方訪問它,而local是定義在函數f1()中的局部變量,所以只能在f1()中訪問。那麼若是咱們要訪問f1()中的local該怎麼辦呢? 這個時候就須要引入閉包了。java
如今咱們來講什麼是閉包,我所理解的閉包就是就是能夠訪問其餘函數內部的函數。一樣像前面的例子,咱們如今就用閉包來實如今函數外部訪問local變量閉包
function f1() { var local = 2; function bar() { console.log(local++) } return bar } var func = f1(); func(); // 2 func(); // 3
這個時候咱們至關於經過函數bar()間接的訪問到了函數f1()中的局部變量local,所以在func()第一次執行的時候咱們獲得local=2,可是爲何第二次調用func()獲得的local卻等於3呢? 按理說我第二次調用func()應該是從f1()中的第一句 var local = 2 開始執行啊。這就涉及閉包的另外一個做用了。函數
閉包除了能訪問函數內部的局部變量,還有一個做用就是將函數內部的變量值儲存到內存中。code
在上面的示例中,f1()的返回值是bar()函數,咱們調用func()的時候其實就是在調用bar(), 而bar()定義在f1內部,是依賴f1()而存在的,所以調用bar時將f1()中的local變量放入了內存中,在第二次調用的時候天然也就從內存中獲得了local++後的值。htm
本文參考文章:http://www.cnblogs.com/cxying... http://www.ruanyifeng.com/blo...blog