美文网首页php
剖析一道变态的阿里面试题

剖析一道变态的阿里面试题

作者: 许骁Charles | 来源:发表于2020-06-30 21:54 被阅读0次

本题旨在深刻了解原型、面向对象、运算符优先级的综合考查。

function Foo() {
    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)
}
Foo.getName()
getName()
Foo().getName()
getName()
new Foo.getName()
new Foo().getName()
new new Foo().getName()

思维导图:

解析:

  • 先函数提升,加载了 function Foo, function getName,此时 getName 输出5,然后加载 var getName,覆盖了前面的 getName,此时 getName 输出4。
  • 接着执行代码Foo.getName(),直接输出2。
  • 执行 getName(),输出4。
  • 执行 Foo().getName(),先执行 Foo(),使得 getName 输出1,返回的 this 是 window。所以 this.getName() 就是全局的 getName,输出1。
  • 执行 getName(),输出1。
  • 执行 new Foo.getName()new Foo().getName(),根据运算符优先级,函数调用…(…)的优先级是19,成员访问 . 是19,带参数列表的 new 是19,无参列表的 new 是18。所以 new Foo.getName() 先执行 Foo.getName(),输出2。new Foo().getName() 从左到右依次执行,new Foo() 相当于创建实例 xxx,实例的 getName() 方法要从原型上去找,因此 xxx.getName() 输出3。
  • 执行 new new Foo().getName(),从最后一个 new 开始,new Foo() 得到实例xxx,然后相当于 new xxx.getName(),属于无参列表的 new,先执行 xxx.getName(),输出3。

因此,答案是:2 4 1 1 2 3 3。

相关文章

网友评论

    本文标题:剖析一道变态的阿里面试题

    本文链接:https://www.haomeiwen.com/subject/tnufqktx.html