js大公司面试题——方法执行顺序

作者: Nice先生的狂想曲 | 来源:发表于2019-10-21 23:56 被阅读0次

    前言

    对于方法执行的顺序,讲真在面试时遇到这题目一开始挺开心的,毕竟自己也大概了解,但是这题考察的并不是一个知识点那么简单,再加上在原型的问题上绕来绕去地可以说十分磨心态的。


    直接上题:

        function Number() {
            getNumber=function () {
                console.log(0)
            }
            return this;
        }
        Number.getNumber=function () {
            console.log(1)
        }
        Number.prototype.getNumber=function () {
            console.log(2)
        }
        var getNumber=function () {
            console.log(3)
        }
        function getNumber() {
            console.log(4)
        }
    
        
        Number.getNumber();//静态方法
        getNumber();//普通函数
        Number().getNumber();//执行Number()后执行内部函数
        getNumber();//普通函数
        new Number.getNumber();//静态方法的实例
        new Number().getNumber();//实例对象的方法
        new new Number().getNumber();
    

    正确的答案:

    1
    3
    0
    0
    1
    2
    2

    第一个Number.getNumber()静态方法,没有任何争议;
    第二个getNumber(),则涉及到函数执行的预编译问题,在预编译中执行
    如果遇到执行的是function,则会先以查找原型链的方式查找到方法,并执行;但如果想题目这种有function和函数表达式varletconst等,则会先执行function的方法,即上面所说的查找原型链,因此这里先执行了

    function  getNumber() {
       console.log(4)
    }
    

    而后执行

    var getNumber=function () {
      console.log(3)
    }
    

    那么,预编译完成后则先执行的function被函数表达式覆盖,而执行的是函数表达式的方法——第一坑
    第三个式子Number().getNumber(),当执行Number()后返回了this,此时指向的是Window,则这是相对于执行了this.getNumber(),而内部函数关系式的上下文为window,所以执行内部函数
    第四个式子还是执行内部函数,如果看到这还不明白,可以试着把第三个式子拆分为Number()getNumber()再F12调试看this,你就明白了——第二坑
    第五个式子new了静态函数,即调用了静态函数
    第六个、第七个式子都是实例对象的成员方法


    以上均是本人通过个人理解与查阅资料而来,如果有错误的地方请指出,谢谢!!
    另外觉得文章写得不错的话可以点赞并关注我哦~

    相关文章

      网友评论

        本文标题:js大公司面试题——方法执行顺序

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