function Foo(){
getName = function(){
console.log(1);
};
return this
}
function getName(){
console.log(5);
}
Foo().getName(); // 1
原以為碌冶,F(xiàn)oo()函數(shù)的this指window疑俭,然后Foo().getName()灾挨,等同于window.getName()蛀恩,所以執(zhí)行結(jié)果應該是5
實際上朋魔,F(xiàn)oo()函數(shù)this 確實是指向 window ,但是這道題的陷阱在于 Foo 函數(shù)執(zhí)行的時候蚀苛,F(xiàn)oo()函數(shù)里面也是個一個函數(shù)表達式嫩挤,getName也是指向的全局夸政,然后里面的 getName 函數(shù)覆蓋了外層的 getName 函數(shù)
function Foo(){
getName = function(){
console.log(1);
};
return this;
}
Foo.prototype.getName = function(){
console.log(3);
};
function getName(){
console.log(5);
};
new Foo().getName() // 3
道題考察的是運算符優(yōu)先級問題闰围,各運算符優(yōu)先級可以查看這里
會發(fā)現(xiàn) 成員訪問 和 new (帶參數(shù)列表)的優(yōu)先級都為 19赃绊,相同等級下既峡,遇到誰先執(zhí)行誰羡榴,所以 new Foo().getName()相當于 (new Foo()).getName()
接下來的就比較簡單了, new 返回一個對象,這個對象的原型指向 Foo.prototype运敢,然后訪問這個對象上的getName方法校仑,自然是調(diào)用寫在原型上的這個方法啦,結(jié)果也就是 3传惠。
來自JavaScript深入之從ECMAScript規(guī)范解讀this
的評論區(qū)