摘要:它的特性是先進(jìn)后出。執(zhí)行第一行代碼該行代碼執(zhí)行后會(huì)變成這樣。對(duì)于來說,點(diǎn)運(yùn)算級(jí)最高,所以先進(jìn)行計(jì)算表達(dá)式的值。如果先運(yùn)算的話,就證明了優(yōu)先級(jí)高于點(diǎn)號(hào),與規(guī)范不和。最后一個(gè)問題同理倒數(shù)第二個(gè)。謝謝李衛(wèi)的提醒。
題
function Foo(){ getName = function () {alert(1);} return this; } Foo.getName = function() {alert(2);}; Foo.prototype.getName = function(){alert(3);}; var getName = function(){alert(4);}; function getName(){alert(5)}; Foo.getName(); getName(); Foo().getName(); getName(); new Foo.getName(); new Foo().getName(); new new Foo().getName();答
2 ----Foo.getName(); 4 ----getName(); 1 ----Foo().getName(); 1 ----getName(); 2 ----new Foo.getName(); 3 ----new Foo().getName(); 3 ----new new Foo().getName();概念
為了閱讀效益最大化,請(qǐng)先了解執(zhí)行環(huán)境和變量對(duì)象的文字性概念。
執(zhí)行環(huán)境挺常見的,它是長這樣的。它的特性是先進(jìn)后出(stack)。
上述圖片是來源于代碼執(zhí)行到Foo( ).getName( )。
(anonymous function) 其實(shí)就是global context
表示方法:
ECStack = [ functionContext(Foo), /*這不是函數(shù)*/ GlobalContext ]
變量對(duì)象也挺常見,在Chrome中長這樣。
表示方法通常是:
//以上述代碼尚未執(zhí)行時(shí)為例 VO = { Foo: {分析, return this } getName: }
代碼執(zhí)行有兩個(gè)階段
進(jìn)入環(huán)境(代碼未執(zhí)行,已編譯)
代碼執(zhí)行
現(xiàn)在一起來看看每一行代碼的執(zhí)行
上述代碼未執(zhí)行時(shí),變量對(duì)象是這樣的。
VO = { Foo: {執(zhí)行"第一行"代碼, return this } getName: }
該行代碼執(zhí)行后VO會(huì)變成這樣。
VO = { Foo: {, getName: }
VO的Foo圖示是這樣的
該行代碼執(zhí)行后VO會(huì)變成這樣。
VO = { Foo: {, getName: }
VO的Foo圖示是這樣
執(zhí)行"第三行"代碼
該行代碼執(zhí)行后VO會(huì)變成這樣。
VO = { Foo: {執(zhí)行"第四行"代碼(第一問), getName: }
直接去VO里尋找結(jié)果發(fā)現(xiàn)alert 2。
getName() //等于 window.getName();
同樣直接在VO里可以直接找到答案 alert 4。
執(zhí)行"第六行"代碼(第三問)
這里比上述多了一個(gè)函數(shù)調(diào)用,F(xiàn)oo()調(diào)用返回this(指向window),所以此時(shí)
Foo().getName(); //等于 window.getName()
同時(shí)注意:
由于Foo()調(diào)用,導(dǎo)致VO發(fā)生了變化。最后alert 1.
VO = { Foo: {執(zhí)行"第七行"代碼(第四問), getName: }
結(jié)果同上
執(zhí)行"最后三行"代碼(第五、六、七問)最后三問考察了new、屬性訪問符、及函數(shù)調(diào)用優(yōu)先順序和new運(yùn)算符的作用。
優(yōu)先順序參考如下,或點(diǎn)這
無論是用哪種屬性訪問表達(dá)式,在"."和"[]"之前的表達(dá)式總是會(huì)先計(jì)算的。
對(duì)于new Foo.getName()來說,點(diǎn)運(yùn)算級(jí)最高,所以先進(jìn)行計(jì)算表達(dá)式Foo的值。如果先運(yùn)算new的話,就證明了new優(yōu)先級(jí)高于點(diǎn)號(hào),與規(guī)范不和。
而對(duì)于new Foo().getName()來說,F(xiàn)oo()與new Foo()相比,new優(yōu)先級(jí)更高,所以先算new Foo(),new出來的新對(duì)象繼承了Foo.prototype屬性,因此新對(duì)象訪問getName時(shí)會(huì)彈出3.
此處要明白new的作用
創(chuàng)建新的空對(duì)象
將新對(duì)象繼承構(gòu)造函數(shù)的prototype屬性,并調(diào)用構(gòu)造函數(shù)初始化
將構(gòu)造函數(shù)的this指針指向新建對(duì)象。
最后一個(gè)問題同理倒數(shù)第二個(gè)。
謝謝ID:李衛(wèi)的提醒。
原題和分析鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78728.html
摘要:作用域和作用域鏈關(guān)于作用域這里不做過多解釋,中根據(jù)作用域可分為全局變量和局部變量。好吧,不是這部分核心,核心是解釋的單線程和事件輪詢機(jī)制。這部分就涉及到閉包的理解了。 前言:這是一道很經(jīng)典的Js面試題,涉及到閉包、變量作用域、setTimeout等知識(shí),對(duì)于深入理解這些內(nèi)容很有幫助 題目描述 //問題描述:請(qǐng)寫出最終的輸出值,并解釋原因 var value1 = 0, value2 ...
摘要:當(dāng)我將此題的作用域鏈畫出來之后,終于感覺作用域入門了。創(chuàng)建函數(shù)的作用域鏈,并初始化為函數(shù)的所包含的對(duì)象,即包含了的作用域鏈。 作用域 為了理解作用域,跪看了好幾篇大神的博文,終于略知一二。 1.題目 其中,看到這樣一道題(稍作修改): function factory() { var name = laruence; var intro = function(){...
摘要:然后最外層這個(gè)函數(shù)會(huì)返回一個(gè)新對(duì)象,對(duì)象里面有一個(gè)屬性,名為,而這個(gè)屬性的值是一個(gè)匿名函數(shù),它會(huì)返回。 最近看到一條有意思的閉包面試題,但是看到原文的解析,我自己覺得有點(diǎn)迷糊,所以自己重新做一下這條題目。 閉包面試題原題 function fun(n, o) { // ① console.log(o); return { // ② fun: function(m) ...
摘要:好吧,我承認(rèn)太標(biāo)題黨了,這篇文章是通過一道前端面試題引出的純技術(shù)討論。我先要矯情無比的從中外詩歌說起。這一星期陸陸續(xù)續(xù)面試了不少于個(gè)人,其中不乏工作履歷突出的候選者。這樣做的問題在于循環(huán)并沒有要求枚舉對(duì)象的修改與當(dāng)前循環(huán)保持一致。 好吧,我承認(rèn)太標(biāo)題黨了,這篇文章是通過一道前端面試題引出的純技術(shù)討論。我先要矯情無比的從中外詩歌說起。 傳統(tǒng)的佛學(xué)經(jīng)典里,被世人熟知的有這樣一句話:一花一世...
摘要:好吧,我承認(rèn)太標(biāo)題黨了,這篇文章是通過一道前端面試題引出的純技術(shù)討論。我先要矯情無比的從中外詩歌說起。這一星期陸陸續(xù)續(xù)面試了不少于個(gè)人,其中不乏工作履歷突出的候選者。這樣做的問題在于循環(huán)并沒有要求枚舉對(duì)象的修改與當(dāng)前循環(huán)保持一致。 好吧,我承認(rèn)太標(biāo)題黨了,這篇文章是通過一道前端面試題引出的純技術(shù)討論。我先要矯情無比的從中外詩歌說起。 傳統(tǒng)的佛學(xué)經(jīng)典里,被世人熟知的有這樣一句話:一花一世...
閱讀 2987·2021-09-22 15:18
閱讀 3405·2019-08-30 15:54
閱讀 3284·2019-08-30 15:53
閱讀 606·2019-08-30 14:12
閱讀 826·2019-08-29 17:01
閱讀 2213·2019-08-29 14:04
閱讀 1405·2019-08-29 13:09
閱讀 875·2019-08-26 17:40