var name = "The Window";
var getNameFunc= {
name: "My Object",
getNameFunc: function() {
return function() {
return this.name;
};
}
};
alert(object.getNameFunc()()); //"The Window"(在非嚴(yán)格模式下)
在高級程序設(shè)計的第7章,7.2.2關(guān)于this對象中,有幾句話實在是不太明白:
以上代碼先創(chuàng)建了一個全局變量 name,又創(chuàng)建了一個包含 name 屬性的對象。這個對象還包含一個方法——getNameFunc(),它返回一個匿名函數(shù),而匿名函數(shù)又返回 this.name。由于 getNameFunc()返回一個函數(shù),因此調(diào)用 object.getNameFunc()()就會立即調(diào)用它返回的函數(shù),結(jié)果就是返回一個字符串。然而,這個例子返回的字符串是"The Window",即全局 name 變量的值。為什么匿名函數(shù)沒有取得其包含作用域(或外部作用域)的 this 對象呢?
前面曾經(jīng)提到過,每個函數(shù)在被調(diào)用時都會自動取得兩個特殊變量: this 和 arguments。內(nèi)部函數(shù)在搜索這兩個變量時,只會搜索到其活動對象為止,因此永遠(yuǎn)不可能直接訪問外部函數(shù)中的這兩個變量。
1.只會搜索到其活動對象??? 不是有個作用域鏈嗎?匿名活動對象在最下面,在匿名對象中找不到,那就去上面的活動對象去找咯?getNameFunc中找不到就去object去找咯。。。不就找到了嗎
2.因此永遠(yuǎn)不可能直接訪問外部函數(shù)中的這兩個變量???是什么意思?外部函數(shù)是指哪個?
你可以通過修改嘗試對 this 加深一下理解 .
1) 將匿名函數(shù)獨立出來給個名字.
稍微調(diào)整如下:
var name = "The Window";
function getThisName(){
return this.name
}
var object = {
name: "My Object",
getNameFunc: function() {
return getThisName
}
};
var getThisNameFunc = object.getNameFunc()
console.log(getThisNameFunc());
現(xiàn)在你再來看這個 getThisName 這個原來你代碼里面的匿名函數(shù),你是不是可以很清楚的看出它的調(diào)用方是認(rèn)誰了? 很顯示到最后調(diào)用這個方法時是隱式的全局變量 (window, 在瀏覽器環(huán)境)
它跟上面聲明的 object 沒有任何關(guān)系. 只是 object.getNameFunc 這個函數(shù)將這個函數(shù)作為返回值.
如果是返回的其他標(biāo)量,自然也不會發(fā)生關(guān)系.
另外你上面的書也提到了, this 和 arguments這兩個隱式的變量是在函數(shù)調(diào)用的時候才獲得的.
所以在這個函數(shù)被調(diào)用的時候明顯它的this 只能是全局的 this.
2) 將 object 直接跟 getThisName 建立關(guān)系:
var name = "The Window";
function getThisName(){
return this.name
}
var object = {
name: "My Object",
getNameFunc:getThisName
};
console.log(object.getNameFunc()); // 輸出: My Object
var getThisNameFunc = object.getNameFunc;
console.log(getThisNameFunc()); // 輸出: The Window
觀察上面的輸出,你再加深以下對這句話的理解:
每個函數(shù)在被調(diào)用時都會自動取得兩個特殊變量
3) 加深對函數(shù)調(diào)用的理解, 加上 apply 和 call
你看一下如下代碼的輸出:
var name = "The Window";
function getThisName(){
return this.name
}
var object = {
name: "My Object",
getNameFunc:getThisName
};
console.log(object.getNameFunc());
var getThisNameFunc = object.getNameFunc
console.log(getThisNameFunc());
console.log(getThisNameFunc.apply(object));
console.log(getThisNameFunc.call(object));
每個函數(shù)在被調(diào)用時都會自動取得兩個特殊變量
同時你也可以通過使用 apply, call 等內(nèi)置函數(shù)原型的方法來指定函數(shù)調(diào)用時所使用的 this 對象. 如上所示.
JavaScript 的這一特點, 跟 Java 等靜態(tài)語言是很不同的. Java 等靜態(tài)語言,往往由于你方法(注意這里沒有說函數(shù))寫的地方就決定了 this 對象的指向,但是 JavaScript 是動態(tài)語言這一點很不一樣. 所以還需要在后面的實踐中多多注意總結(jié)和理解.
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。