閱讀文章前, 請先閱讀阮一峰老師的這篇文章http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
前人寫過的, 而且寫得很好, 就沒必要重復下去了. 只加一些阮老師的文章里沒有說的.順便總結一下.
引用一句話: "閉包就是functions that return function"(出處已經忘記啦)
閉包的類型: 循環閉包, 函數閉包
閉包的特點: 外部訪問函數內部的值, 函數內部變量不被回收
函數閉包類型中閉包函數的this指向.
考慮如下代碼:
var name = "window";
var object = {
name : "object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
var obj = {
name : "object",
getNameFunc : object.getNameFunc()
};
function foo() {
return this.name;
}
console.log(foo());//Window
console.log(object.getNameFunc()()); //Window
console.log(obj.getNameFunc()); //object
閉包函數無法直接訪問包含他的函數的this對象, 因為二者的this指向是不一樣的.
外部函數的this指向調用他的對象, 內部函數的this指向了全局對象, 其實並不難理解.
類比以下兩個函數的調用
foo();//Window
object.getNameFunc()(); //Window
實際上, 當調用object.getNameFunc()時, 就像全局對象返回了一個函數, 返回的這個函數和foo函數其實並無兩樣.
在全局中調用這個返回的函數時, 函數的this自然就指向了全局對象, 就好像調用foo函數一樣.
而當object.getNameFunc()在obj內部時, 返回的閉包函數就成了obj 的屬性, 此時閉包函數的this就指向了obj對象.
