今天看到一個關於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