zoukankan      html  css  js  c++  java
  • 关于foo的一个面试题

    今天看到一个关于foo的一个面试题,赶脚特别有意思

        function foo(){// 第16行
            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()//2
        //foo是一个函数,也可以说是一个对象,所以它也可以挂载一些属性和方法,18行在其上挂载了一个getName方法
        //执行的结果是
        
        getName()//4
        //21行有一个全局函数,全局函数声明提前后被20行的getName覆盖,所以输出4
    
        foo().getName()//1
        //foo()执行完成后,将全局的getName也就是window.getName给更改后返回this,而在这里this执行的就是window,所以最后执行的就是window.getName,所以输出1
    
        getName()//1
        //在上面已经更改全局的getName,所以依然是1
    
        new foo.getName()//2
        //new 操作符在实例化构造器的时候,会执行构造器函数,也就是说,foo.getName会执行,输出2
    
        new foo().getName()//3
        //new操作符的优先级较高,所以会先new foo()得到一个实例,然后再执行实例的getName方法,这个时候,实例的构造器里没有getName方法,就会执行构造器原型上的getName方法
    
        new new foo().getName()//3
        //先执行new foo()得到一个实例,然后在new 这个实例的getName方法,这个时候会执行这个方法,所以输出3
    
        //除了本地对象的方法,其他的函数都能new
    
    
  • 相关阅读:
    解决Ubuntu19.04无法安装SecureCRT
    gluster学习(二)
    gluster学习(一)
    ansible安装过程遇到的问题
    shell在linux里摇摇晃晃
    ubuntu18.10安装网易云音乐
    MVC Bundle生成的css路径问题
    Vuejs自定义select2指令
    VueJs笔记
    在webAPI的BaseController上使用RoutePrefix
  • 原文地址:https://www.cnblogs.com/yinxingen/p/8035016.html
Copyright © 2011-2022 走看看