js綜合面試題
首先定義了一個叫Foo的函數(shù)规丽,之后為Foo創(chuàng)建了一個叫getName的靜態(tài)屬性存儲了一個匿名函數(shù),之后為Foo的原型對象新創(chuàng)建了一個叫getName的匿名函數(shù)蓝牲。之后又通過函數(shù)變量表達式創(chuàng)建了一個getName的函數(shù),最后再聲明一個叫getName函數(shù)泰讽。
function Foo() {
//注意這里沒用let var const等命令,所以會被掛到window上
getName = function () { console.log(1); };
return this;
}
Foo.getName = function () { console.log(2); };
Foo.prototype.getName = function () { console.log(3); };
var getName = function () { console.log(4); };
function getName() { console.log(5); }
//運算符優(yōu)先級 . > () > new
Foo.getName();//2--不解釋
getName();//4--log5的函數(shù)聲明提升,被log4的覆蓋掉
Foo().getName();//1--Foo返回的this是window,window下面原本的getName為log4,但是因為Foo函數(shù)執(zhí)行,又掛載了一個全局getName覆蓋掉了log4,所以為1
getName();//1--因為getName被上一行代碼修改為了1,所以為1
//考察運算符優(yōu)先級
new Foo.getName();//2--new (Foo.getName)();
new Foo().getName();//3--(new Foo()).getName()
new new Foo().getName();//3--new ((new Foo()).getName)();