摘要:我是一個(gè)的初學(xué)者,這幾天被直接訪問標(biāo)識(shí)符和通過訪問標(biāo)識(shí)符搞的頭疼,于是大膽的做了一個(gè)猜測(cè)直接訪問標(biāo)識(shí)符是通過作用域鏈進(jìn)行查找的。然后就開始試了起來結(jié)合下面的代碼來說首先第一個(gè)調(diào)用函數(shù),通過作用域鏈來查找。
我是一個(gè)js的初學(xué)者,這幾天被直接訪問標(biāo)識(shí)符和通過this訪問標(biāo)識(shí)符搞的頭疼,于是大膽的做了一個(gè)猜測(cè):
1. 直接訪問標(biāo)識(shí)符是通過作用域鏈進(jìn)行查找的。
2. 通過this訪問標(biāo)識(shí)符是通過原型鏈來查找的。
然后就開始試了起來!!??!
結(jié)合下面的代碼來說
var a = "abc"; var obj = { a: "def", display3: function () { var a = "sssss"; console.log(a); }, display4: function() { console.log(this.a); } } Object.prototype.a = "ghi"; function display1() { // var = "hahaha"; console.log(a) } function display2() { console.log(this.a); } display1(); // "abc" display2(); // "abc" obj.display3(); obj.display4(); // display2.call(obj); // "def" // display1.call(obj); // "abc"
首先:
第一個(gè):
調(diào)用display1函數(shù),通過作用域鏈來查找a。此時(shí)display1的作用域鏈為:display1的活動(dòng)對(duì)象→全局活動(dòng)對(duì)象,
所以找到了全局活動(dòng)對(duì)象中的"abc",如果在display1中有變量a,那么輸出的則是這個(gè)變量的值。
第二個(gè)
調(diào)用diplay2函數(shù),通過原型鏈來查找a。因?yàn)閠his是基于當(dāng)前的執(zhí)行環(huán)境綁定的,所以this指向全局變量對(duì)象(也就是window),所以找到了"abc"并輸出。
有意思的是,此時(shí)如果我刪除window中定義的a="abc", 那么輸出結(jié)果則是"ghi". 于是回憶了一下自己所學(xué)的知識(shí),發(fā)現(xiàn)因?yàn)閣indow對(duì)象是Global對(duì)象在瀏覽器中的表現(xiàn),然后Global是js中的單體內(nèi)置對(duì)象,那么似乎它也應(yīng)該繼承自O(shè)bject.prototype, 恩..按照我的猜想,輸出結(jié)果為"ghi"是情理之中的。
第三個(gè):
通過obj調(diào)用display3函數(shù),因?yàn)榍懊鏇]有this,所以是通過作用域鏈進(jìn)行查找的,此時(shí)display3的作用域鏈為display1的活動(dòng)對(duì)象→全局活動(dòng)對(duì)象,所以輸出結(jié)果是"abc", 同樣,如果我再display3中定義了a,那么輸出的則是這個(gè)a的值
第四個(gè)
通過obj調(diào)用display4函數(shù),因?yàn)榍懊嬗衪his,所以是通過原型鏈進(jìn)行查找的,此時(shí)this指向的是obj,所以輸出的結(jié)果是obj對(duì)象中"def",如果我們刪除obj中的a屬性,那么輸出結(jié)果則是Object.prototype中的"ghi",如果再刪除這個(gè)ghi,那么輸出結(jié)果就是undefined了。
上面這些好像都符合邏輯,可是我又突然發(fā)現(xiàn),當(dāng)調(diào)用display1時(shí),如果刪除了作用域鏈中每個(gè)變量對(duì)象的a屬性,那么輸出結(jié)果則是"ghi", 這個(gè)"ghi"是在Object.prototype中定義的,所以
綜合了一下
1. 直接訪問標(biāo)識(shí)符是通過作用域鏈和原型鏈綜合進(jìn)行查找的。
2. 通過this訪問標(biāo)識(shí)符是通過原型鏈來查找的。
然后又出現(xiàn)了一個(gè)問題:直接訪問標(biāo)識(shí)符的查找順序是 1:先查找作用域鏈前端的變量對(duì)象,然后再查找它的原型,然后再查找作用域鏈中下一個(gè)變量對(duì)象,然后再查找它的原型 還是 2: 一直查找作用域鏈中的變量對(duì)象,知道window對(duì)象,再查找它的原型呢?
然后又突然發(fā)現(xiàn),在調(diào)用display1時(shí),如果display1中沒有定義a變量,訪問到的則是window中的a = "abc",而不是Object.prototype中的a = "ghi".
所以再綜合一下
1. 直接訪問標(biāo)識(shí)符的順序是按順序查找作用域鏈中的每一個(gè)變量對(duì)象直至全局變量對(duì)象,如果全局變量對(duì)象中沒
有該變量,則沿著window對(duì)象的原型鏈進(jìn)行查找。
2. 通過this訪問標(biāo)識(shí)符是通過原型鏈來查找的。
我去累死了,我也沒想到自己寫了這么多,從結(jié)果來看,應(yīng)該是這樣,不過也不知道到底是不是這樣。。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/85944.html
摘要:上周發(fā)布了一款名為的工具,是完全采用以下簡(jiǎn)稱來開發(fā)的。而使用,可以在一定程度上減少這個(gè)問題。自成文檔的特性對(duì)于多人維護(hù)的項(xiàng)目來說是非常有用的,它能夠大大降低項(xiàng)目當(dāng)中溝通和理解的成本。作為的超集,我們可以在中放心使用的各種高級(jí)能力。 showImg(https://segmentfault.com/img/remote/1460000019689248); 上周發(fā)布了一款名為 Smart...
摘要:好吧,我承認(rèn)太標(biāo)題黨了,這篇文章是通過一道前端面試題引出的純技術(shù)討論。我先要矯情無比的從中外詩(shī)歌說起。這一星期陸陸續(xù)續(xù)面試了不少于個(gè)人,其中不乏工作履歷突出的候選者。這樣做的問題在于循環(huán)并沒有要求枚舉對(duì)象的修改與當(dāng)前循環(huán)保持一致。 好吧,我承認(rèn)太標(biāo)題黨了,這篇文章是通過一道前端面試題引出的純技術(shù)討論。我先要矯情無比的從中外詩(shī)歌說起。 傳統(tǒng)的佛學(xué)經(jīng)典里,被世人熟知的有這樣一句話:一花一世...
摘要:好吧,我承認(rèn)太標(biāo)題黨了,這篇文章是通過一道前端面試題引出的純技術(shù)討論。我先要矯情無比的從中外詩(shī)歌說起。這一星期陸陸續(xù)續(xù)面試了不少于個(gè)人,其中不乏工作履歷突出的候選者。這樣做的問題在于循環(huán)并沒有要求枚舉對(duì)象的修改與當(dāng)前循環(huán)保持一致。 好吧,我承認(rèn)太標(biāo)題黨了,這篇文章是通過一道前端面試題引出的純技術(shù)討論。我先要矯情無比的從中外詩(shī)歌說起。 傳統(tǒng)的佛學(xué)經(jīng)典里,被世人熟知的有這樣一句話:一花一世...
摘要:除此以外,讓元素脫離文檔流也是一個(gè)很好的方法。因?yàn)樵匾坏┟撾x文檔流,它對(duì)其他元素的影響幾乎為零,性能的損耗就能夠有效局限于一個(gè)較小的范圍。講完重排與重繪,往元素上綁定事件也是引起性能問題的元兇。高性能這本書非常精致,內(nèi)容也非常豐富。 showImg(https://segmentfault.com/img/bVJgbt?w=600&h=784); 入手《高性能JavaScript》一...
閱讀 779·2021-10-09 09:58
閱讀 644·2021-08-27 16:24
閱讀 1727·2019-08-30 14:15
閱讀 2387·2019-08-30 11:04
閱讀 2073·2019-08-29 18:43
閱讀 2171·2019-08-29 15:20
閱讀 2720·2019-08-26 12:20
閱讀 1619·2019-08-26 11:44