一道前端JS題目

2021-09-18 04:03:22 字數 2945 閱讀 8680

做過很多前端筆試題,有些題看起來簡單,就是讀程式寫結果,但要麼做錯,要麼對答案不確定,這裡找到一道比較綜合的題目

function foo() ;   //(1)函式內定義了乙個函式變數

return this;

}

foo.getname = function () ; //(2)建立了foo的靜態屬性

foo.prototype.getname = function () ; //(3)定義了foo函式原型物件上的getname函式

var getname = function () ; //(4)通過函式變數表示式定義了乙個叫getname的函式

function getname() //(5)宣告了乙個getname函式

//請寫出以下輸出結果:

foo.getname();

getname();

foo().getname();

getname();

new foo.getname();

new foo().getname();

new new foo().getname();

第一題:

foo.getname(); //2

foo.getname; // function()

這道題比較簡單,foo函式上的getname函式,執行的是第(2)句

第二題:

getname(); //4
我多次做這道題都會認為答案是5,其實不然。

因為變數宣告提公升,所以(4)拆分成兩句,var getname; getname = function()

其中var getname函式表示式被提公升,但getname = function()則不提公升,(5)函式宣告function getname同樣提公升,結果順序就變為

function foo() ;   

return this;

}var getname; //變數宣告提公升

function getname () ; //變數宣告提公升,getname()的結果為alert(5)

foo.getname = function () ;

foo.prototype.getname = function () ;

getname = function () ; //覆蓋了getname()的結果

因此,getname()的結果為4.

第三題

foo().getname(); //1
先執行foo()函式,再呼叫其返回值物件的getname屬性函式。

(1)句沒有var宣告,就先在foo()裡尋找getname宣告,沒有找到,就在外層作用域中尋找,在第(4)句找到了var getname,將此變數的值賦值為function()

foo()返回值物件this指代的是呼叫這個函式的物件,在這裡相當於window,則foo().getname()相當於window.getname(),而windowgetname()已經被賦值為function(),所以結果就為1。

foo.getnamefoo().getname的區別

function foo()

foo.getname; //undefined

foo().getname; //'zoe'

第四題

getname(); //相當於呼叫window.getname(),結果為1
第五題

new foo.getname(); //2
成員訪問運算子(.)的優先順序大於new,小括號()的優先順序又大於(.)

所以問題改寫成

new (foo.getname)();相當於把getname當做建構函式在執行
第六題

new foo().getname(); //3
同樣因為優先順序,改寫成

(new foo()).getname();

var f = foo();

f.getname();

首先構建了乙個foo函式的例項化物件,再呼叫物件的getname屬性,由於foo建構函式沒有新增getname屬性,所以向上查詢到原型物件,即(3)句,得到結果3

我犯過的乙個錯誤,將(1)看成foo函式的屬性,其實不是的,那只是函式體內的乙個變數,只能在函式體內訪問,如果要表示函式屬性,需要寫成this.getname

第七題

new new foo().getname(); //3
改寫成

new ((new foo()).getname)();

var f = new foo();

var x = f.getname;

new x();

JS練習 prototype的一道題目

1.分別對例項的name賦值,並沒有涉及到原型的name屬性 var fun function fun.prototype.name peter var a new fun var b new fun a.name jack b.name tom console.log a.name jack co...

一道超級複雜的js題目

先看以下 1 function foo 3return this 4 5 foo.getname function 6 foo.prototype.getname function 7var getname function 8function getname 910 foo.getname 11g...

一道this的題目

請問下面 中的this值指向的是全域性物件還是物件o?function f return c var o new f console.log o.constructor.name object這裡的this指向全域性物件,因為 c call without new。這裡用正常的方式呼叫的函式 c 所...