關於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM