關於js閉包自己的理解

假設有A函數和B函數,A潛逃了B函數,也就是B函數載A函數的函數體內,那麼載A函數定義的變量,B函數是可以看見的,也就是說B函數是可以引用A函數中定義的變量的。反之,則不行,我們用代碼來解釋一下

function A() {
    var local = "carl";
    function B() {
        return local;
    }
    return B();
}
var global = A();
console.log("name=" + global);

想想這段代碼會輸出什麼呢?
答案是:name=carl;
也就是說,這裏,b方法引用了a方法中的變量。
我們再來看看另外一個例子:

function A() {

    function B() {
        var local = "carl";
        return local;
    }
    console.log("local="+local);
    return B();
}
var global = A();
console.log("name=" + global);

看看這段代碼的執行結果是什麼,結果是報錯,爲什麼?因爲在A方法裏面引用了local這個B方法中的變量,而這個變量是對A不可見的。
實際上爲什麼會有這麼一個結果,他的本質原因在於js裏面的作用域鏈,在js裏面,是沒有塊這個作用域的,取而代之的是函數作用域。a函數的作用域鏈有兩個元素,一個是a本身,一個是全局作用域。在a和全局作用域都沒有發現local的定義,所以就會報錯。b的作用域鏈是這樣的,它的第一個元素是它本身,第二個是a函數,第三個是全局作用域,所以,第一段代碼是可以正常運行的。
最後,再來看看這個問題

function A() {

    function B() {
        var local = "carl";
        return {
            getLocal : function() {
                return local;
            },
            setLocal : function(value) {
                local = value;
            }
        }
    };
    return B();

}
var local = A();
console.log("name=" + local.getLocal());
local.setLocal("wang");
console.log("name=" + local.getLocal());

如果很清楚這個的結果,就基本掌握了什麼是js的閉包了。這篇感想,我也是查閱了很多資料,讓後把自己想的寫出來,如果有什麼不對的,希望博友們指出。
上面的結果是
name=carl
name=wang

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章