淺談Javascript閉包和匿名函數【1】

閉包含義:閉包

閉包是指有權訪問另外一個函數做用域中的變量的函數,建立閉包的常見的方式,就是在
一個函數內部建立另外一個函數,經過另外一個函數訪問這個函數的局部變量。函數

這個時候咱們就要談到匿名函數了.code


匿名函數內存

匿名函數就是沒有名字的函數,閉包是可訪問一個函數做用域裏變量的函數。看例子:作用域

function box () {    //這是一個普通函數
    return 'anonymous';    
}
alert(box());

那麼匿名函數是什麼呢?看例子:io

function () {
    return 'anonymous';
}

這個函數並無執行!!!
若是讓匿名函數執行呢。咱們能夠將匿名函數賦值給一個變量:function

var box = function (){
    return 'anonymous';
};
alert(box());    //anonymous

可是這種表達式有時候並無什麼含義,那咱們能夠用自執行的方法去調用匿名函數:匿名函數

(function () {
    alert('anonymous'); 
})();

匿名函數如何傳參呢?看例子:變量

(function (a) {
    alert(a);
})(100);    //alert返回100

匿名函數和閉包的做用

談到閉包,咱們就不得不談到全局變量和局部變量。方法

全局變量:

全局變量在實際寫項目中我的額不建議使用,由於大量的全局變量會污染代碼,每一個模塊均可以去地道用,必將引來不少錯誤。因此推薦變量私有化

什麼是變量私有化?

var a = 100;    //全局變量

function box () {
alert(a);
}
box();    //調用函數返回100

經過上面的代碼能夠看出,每一個函數內均可以調用外部的局部變量。將a變量變成了公有化的變量,有時候咱們並不但願這麼作。因此咱們能夠將變量定義在函數內部使變量變成私有化變量,外部沒法訪問到這個變量

function box () {
    var a = 100;    //局部變量
}

alert(a);    //a is not defined

這就完事了麼?並無!!記住一點:局部變量在每次調用時都會初始化!!!(重要的事情用三個感嘆號...)
咱們來用一個後置遞增的一個小例子來告訴你們:

function a () {
    var b = 100;
    b++;
    return b;
}
alert(a());    //101
alert(a());    //101

不難看出,每次調用,變量b都會被初始化,因此每次調用都會返回101而不是累加。咱們能夠用普通函數內部嵌套匿名函數,造成一個閉包來使變量駐留在內存中。

function a () {
    var b = 100;    //局部變量
    return function () {    //閉包
        b++;
        return b;
    };
}
var c = a();
alert(c());    //101
alert(c());    //102

爲何要將a()賦值給變量c呢?這裏咱們就要談到匿名函數調用問題:
匿名函數如何調用?仍是上面的例子:

function a () {
    var b = 100;
    return function () {
        return b;
    };
}
alert(a());    //會將整個函數體打印出來
alert(a()());    //這樣才調用了函數內部的匿名函數

看到這裏。你們應該理解了爲何要將a()賦值給c變量了吧?由於若是直接使用a()();這樣去調用,每次調用仍是會初始化局部變量,而咱們賦值給變量c,外層函數被調用了一次賦值給了C,而每次調用C去調用內部的匿名函數,從而達到了閉包。

我會在下一章繼續講閉包,歡迎你們來糾正錯誤及指正!

Brian Lee
相關文章
相關標籤/搜索