初識閉包

寫文章以前,查閱了不少的資料,也看了不少大牛對閉包的解釋,如今總算是對閉包有了必定的理解。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

相關文章
相關標籤/搜索