掘金 上看到的乙個筆試題目,記錄並分析總結以下考察點。
function foo ()
return this
} foo.getname = function ()
foo.prototype.getname = function ()
var getname = function ()
function getname ()
//判斷輸出結果
foo.getname(); // 2
getname(); // 4
foo().getname(); // 1
getname(); // 1
new foo.getname(); // 2
new foo().getname(); // 3
new new foo().getname(); //3
第乙個 不用說什麼,直接呼叫foo建構函式的getname屬性,輸出2。
第二個 呼叫當前作用域下的getname函式,要注意函式表示式和函式宣告的不同:
函式宣告會『被提前』到外部指令碼或者外部函式的頂部,所以這種方式宣告的函式,可以在它被定義之前的**中所呼叫。
函式表示式,就和宣告變數一樣了,變數宣告會提前到頂部,但是賦值會在執行到原位置的時候才進行。
4會變數提公升,但是並沒有賦值,然後5函式提公升(在4賦值之前呼叫下getname(),輸出的是5),而**執行4的位置時,會賦值就覆蓋了5。所以第二個會輸出4。
第三個 foo()執行時,foo函式體內並沒有getname變數,所以就去上一層window下找,重新賦值了window下的getname為輸出1(如果沒有找到,會在window下建立乙個getname),然後返回了this,這裡的this指向的是window,再呼叫window的getname屬性,即為重新賦值後的輸出1。
第四個 執行當前作用域下的getname,注意此時getname已經重新賦值,所以輸出1
第五個 這裡需要特別注意表示式的執行順序,詳見 mdn
.
比無引數列表new
執行的優先順序高,所以是new (foo.getname)()
輸出2
第六個 同樣是執行順序
()
比.
的執行優先順序高,所以是(new foo()).getname()
,foo作為建構函式,指定了返回this,而在建構函式中,this指向的是生成的例項,而foo中沒有對例項新增getname屬性,所以在呼叫例項的getname時,會去foo.prototype中找,所以輸出3
第七個 同樣是執行順序
new ((new foo()).getname)()
是以原型鏈上的getname為建構函式來執行,輸出3
關於乙個面試題目
曾經碰到乙個面試題目,誰能給出標準答案呢?200個小孩圍乙個圈,從頭開始1到4報數,報到4這個數的退出圓圈,最後乙個留在圈裡的小孩編號是多少?在網上看到很多人給出的答案是 標準答案.public static void main string args while list.size 4 syste...
面試題目記錄2
1.session喜歡丟值且佔記憶體,cookis不安全,請問用什麼辦法代替這兩種原始的方法 回答一 是iis中由於有程序 機制,系統繁忙的話session會丟失,可以用sate server或sql server資料庫的方式儲存session不過這種方式比較慢,而且無法捕獲session的end事...
乙個面試題
題目是 假設乙個 搜尋引擎收錄了2 24首歌曲,並記錄了可收聽這些歌曲的2 30條url,但每首歌的url不超過2 10個。系統會定期檢查這些url,如果乙個url不可用則不出現在搜尋結果中。現在歌曲名和url分別通過整型的song id和url id唯一確定。對該系統有如下需求 1 通過song ...