假設有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