function Foo(){
getName = function(){
console.log(1);
};
return this
}
function getName(){
console.log(5);
}
Foo().getName(); // 1
原以为,Foo()函数的this指window,然后Foo().getName(),等同于window.getName(),所以执行结果应该是5
实际上,Foo()函数this 确实是指向 window ,但是这道题的陷阱在于 Foo 函数执行的时候,Foo()函数里面也是个一个函数表达式,getName也是指向的全局,然后里面的 getName 函数覆盖了外层的 getName 函数
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
道题考察的是运算符优先级问题,各运算符优先级可以查看这里
会发现 成员访问 和 new (带参数列表)的优先级都为 19,相同等级下,遇到谁先执行谁,所以 new Foo().getName()相当于 (new Foo()).getName()
接下来的就比较简单了, new 返回一个对象,这个对象的原型指向 Foo.prototype,然后访问这个对象上的getName方法,自然是调用写在原型上的这个方法啦,结果也就是 3。