《Javascript高級程序設(shè)計(jì)》這本書里提到,每個(gè)函數(shù)在被調(diào)用時(shí)都會自動取得兩個(gè)特殊變量時(shí),只會搜索到其活動對象為止,因此永遠(yuǎn)不可能直接訪問外部函數(shù)中的這兩個(gè)變量。
所以是不是可以理解為會一直訪問到全局變量才會停止呢(沒有綁定的話)?以下是代碼:
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í)候才會被綁定
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一般指向全局對象(window,global等)),需要注意的是this只與函數(shù)的執(zhí)行環(huán)境有關(guān),當(dāng)函數(shù)作為某個(gè)對象的方法來“引用”時(shí),this指向這個(gè)對象,比如說:
var obj = {
name : "obj",
say : function(){
console.log(this);
}
};
var obj2 = {
name : "obj2"
};
obj2.say = obj.say;
obj2.say(); //輸出obj2
//這里say明明是在obj里面定義的方法,obj2只是對其進(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á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í)記錄器會把此函數(shù)的執(zhí)行環(huán)境壓入環(huán)境棧,此時(shí)活動的就是這個(gè)環(huán)境,那么this指向就引用這個(gè)環(huán)境對象。當(dāng)執(zhí)行完成時(shí),把這個(gè)環(huán)境從棧頂彈出去?;揪褪沁@么一個(gè)過程,當(dāng)然棧里最少都會保持一個(gè)環(huán)境。
那什么時(shí)候會往環(huán)境棧里壓棧值就應(yīng)該能猜的出來,以對象方法的調(diào)用或人為干預(yù)時(shí),如通過.call,.apply,.bind時(shí)等。object.getNameFunc()的過程就是,object進(jìn)棧--執(zhí)行----->object出棧,等到它返回的匿名函數(shù)運(yùn)行時(shí)環(huán)境棧就只剩全局了,this引用自然訪問到的是'The window'。
至于它說的只會訪問到活動對象為止,可以這樣驗(yàn)證
var object = {
getNameFunc : function(){
console.log(this.name);
return function(){
return this.name;
};
}
};
console 這一行應(yīng)該打出一個(gè)undefined,而不是打出The window,也就是說當(dāng)前活動對象上沒有,不會再搜索棧底的其它環(huán)境,這和作用域是不一樣的。
北大青鳥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”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jī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ù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(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)師。