做過很多前端筆試題,有些題看起來簡單,就是讀程式寫結果,但要麼做錯,要麼對答案不確定,這裡找到一道比較綜合的題目
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()
,而window
的getname()
已經被賦值為function()
,所以結果就為1。
foo.getname
和foo().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 所...