《Javascript高級(jí)程序設(shè)計(jì)》這本書里提到,每個(gè)函數(shù)在被調(diào)用時(shí)都會(huì)自動(dòng)取得兩個(gè)特殊變量時(shí),只會(huì)搜索到其活動(dòng)對(duì)象為止,因此永遠(yuǎn)不可能直接訪問外部函數(shù)中的這兩個(gè)變量。
所以是不是可以理解為會(huì)一直訪問到全局變量才會(huì)停止呢(沒有綁定的話)?以下是代碼:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()()); //"The Window"
非常感謝!
1.this變量訪問在運(yùn)行時(shí)候才會(huì)被綁定
2.其他變量訪問在定義(位置)時(shí)候被綁定
看這段代碼應(yīng)該可以理解一部分
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return this.name;
}
};
var fun = object.getNameFunc;
console.log(object.getNameFunc())//My Object
console.log(fun())// The Window
匿名函數(shù)具有全局性(匿名函數(shù)的this一般指向全局對(duì)象(window,global等)),需要注意的是this只與函數(shù)的執(zhí)行環(huán)境有關(guān),當(dāng)函數(shù)作為某個(gè)對(duì)象的方法來“引用”時(shí),this指向這個(gè)對(duì)象,比如說:
var obj = {
name : "obj",
say : function(){
console.log(this);
}
};
var obj2 = {
name : "obj2"
};
obj2.say = obj.say;
obj2.say(); //輸出obj2
//這里say明明是在obj里面定義的方法,obj2只是對(duì)其進(jìn)行引用,但this最終指向obj2,所以this指向僅僅與函數(shù)的執(zhí)行環(huán)境有關(guān)。
當(dāng)然還有一些比較特殊的,像es6的箭頭函數(shù),卻是與函數(shù)的定義環(huán)境有關(guān),比如說:
var obj = {
name : "obj",
say : function(){
return () => {console.log(this)};
}
};
var obj2 = {
name : "obj2"
};
obj2.say = obj.say();
obj2.say(); //輸出obj
//這里箭頭函數(shù)為什么要包含在一個(gè)function里面進(jìn)行返回是因?yàn)樾枰{(diào)整this的指向,上面說過箭頭函數(shù)this指向與定義環(huán)境有關(guān),在say方法的內(nèi)部的this才是指向obj的,如果直接進(jìn)行箭頭函數(shù)賦值,this則會(huì)指向定義環(huán)境window
上面是本人的理解,如果有錯(cuò)誤歡迎指正
在最新的ECMAScript262語言規(guī)范的8.1.1中提到一個(gè)詞叫Environment Recorders,建議有興趣可以看下,在上一版的規(guī)范中貌似叫個(gè)execution context,就是執(zhí)行上下文。
可以這樣理解,在解釋器的實(shí)現(xiàn)中Environment Recorders就是用來記錄一個(gè)環(huán)境棧信息,棧么,就是后進(jìn)先出,通俗點(diǎn)說就是吃多了吐出來,而堆是先進(jìn)先出,就是吃多了拉出來。棧底記錄是的全局環(huán)境,如window 或 global環(huán)境。在函數(shù)執(zhí)行時(shí)記錄器會(huì)把此函數(shù)的執(zhí)行環(huán)境壓入環(huán)境棧,此時(shí)活動(dòng)的就是這個(gè)環(huán)境,那么this指向就引用這個(gè)環(huán)境對(duì)象。當(dāng)執(zhí)行完成時(shí),把這個(gè)環(huán)境從棧頂彈出去?;揪褪沁@么一個(gè)過程,當(dāng)然棧里最少都會(huì)保持一個(gè)環(huán)境。
那什么時(shí)候會(huì)往環(huán)境棧里壓棧值就應(yīng)該能猜的出來,以對(duì)象方法的調(diào)用或人為干預(yù)時(shí),如通過.call,.apply,.bind時(shí)等。object.getNameFunc()的過程就是,object進(jìn)棧--執(zhí)行----->object出棧,等到它返回的匿名函數(shù)運(yùn)行時(shí)環(huán)境棧就只剩全局了,this引用自然訪問到的是'The window'。
至于它說的只會(huì)訪問到活動(dòng)對(duì)象為止,可以這樣驗(yàn)證
var object = {
getNameFunc : function(){
console.log(this.name);
return function(){
return this.name;
};
}
};
console 這一行應(yīng)該打出一個(gè)undefined,而不是打出The window,也就是說當(dāng)前活動(dòng)對(duì)象上沒有,不會(huì)再搜索棧底的其它環(huán)境,這和作用域是不一樣的。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。