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