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

前言

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


直接上题:

    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了静态函数,即调用了静态函数
第六个、第七个式子都是实例对象的成员方法


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

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

推荐阅读更多精彩内容

  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 7,378评论 0 7
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,796评论 1 32
  • 继承 一、混入式继承 二、原型继承 利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承,这种实现继承的...
    magic_pill阅读 4,693评论 0 3
  • 1,javascript 基础知识 Array对象 Array对象属性 Arrray对象方法 Date对象 Dat...
    Yuann阅读 4,547评论 0 1
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,735评论 0 38