相信大多做前端的同學(xué)對這幾個概念都不會太陌生,但是真正能夠看透看懂應(yīng)該不多,今天看了 阮一峰老師的文章感覺講的很好,特別是后面寫的例子更是一針見血,正如他所說的,理解了那兩道題就徹底了解閉包.但是他后面沒有對這兩個例子過多分析,可能讓我們自己去真正的領(lǐng)悟真正的看清.
原文地址:學(xué)習(xí)Javascript閉包
例子1
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());//The Window
例子2
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());//My Object
栗子分析
在這兩段代碼中,都有一個變量name做為全局變量.,然后再聲明一個對象,里面有一個name屬性,還有一個函數(shù)getNameFunc.getNameFunc里面直接返回一個函數(shù).還有一點(diǎn)差別是例2里面的this賦值給了that變量.
為什么例1最后的結(jié)果是"The Window"而不是object里面的name"My object"呢?
首先微姊,要理解函數(shù)作為函數(shù)調(diào)用和函數(shù)作為方法調(diào)用。
我們把最后的一句拆成兩個步驟執(zhí)行:
var first = object.getNameFunc();
var second = first();
其中第一步分预,獲得的first為返回的匿名函數(shù)兢交,此時的getNameFunc()作為object的方法調(diào)用,如果在getNameFunc()中使用this笼痹,此時的this指向的是object對象配喳。
第二部,調(diào)用first函數(shù)凳干,可以很清楚的發(fā)現(xiàn)晴裹,此時調(diào)用first函數(shù),first函數(shù)沒有在對象中調(diào)用救赐,因此是作為函數(shù)調(diào)用的涧团,是在全局作用域下,因此first函數(shù)中的this指向的是window经磅。
在閉包中:
內(nèi)部函數(shù)可以訪問定義它們的外部函數(shù)的參數(shù)和變量(除了this和arguments之外)
如果需要訪問對象的name屬性的話泌绣,就需要顯示的定義一個變量that來引用this,而這個變量此時就指向object對象了预厌。所以第一個例子閉包函數(shù)無法訪問這個this阿迈,它只能訪問到全局的this。例2中this就是objec對象把this賦值that就是一個局部變量,所以可以返回My Object.
有不同看法歡迎交流.