美文网首页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