《深入之this》下的思考题

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。

来自JavaScript深入之从ECMAScript规范解读this
的评论区

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容