前言
對于方法執(zhí)行的順序,講真在面試時遇到這題目一開始挺開心的,畢竟自己也大概了解,但是這題考察的并不是一個知識點那么簡單,再加上在原型的問題上繞來繞去地可以說十分磨心態(tài)的。
直接上題:
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();//靜態(tài)方法
getNumber();//普通函數
Number().getNumber();//執(zhí)行Number()后執(zhí)行內部函數
getNumber();//普通函數
new Number.getNumber();//靜態(tài)方法的實例
new Number().getNumber();//實例對象的方法
new new Number().getNumber();
正確的答案:
1
3
0
0
1
2
2
第一個Number.getNumber()靜態(tài)方法,沒有任何爭議;
第二個getNumber(),則涉及到函數執(zhí)行的預編譯問題,在預編譯中執(zhí)行:
如果遇到執(zhí)行的是function,則會先以查找原型鏈的方式查找到方法,并執(zhí)行;但如果想題目這種有function和函數表達式var、let、const等,則會先執(zhí)行function的方法,即上面所說的查找原型鏈,因此這里先執(zhí)行了
function getNumber() {
console.log(4)
}
而后執(zhí)行
var getNumber=function () {
console.log(3)
}
那么,預編譯完成后則先執(zhí)行的function被函數表達式覆蓋,而執(zhí)行的是函數表達式的方法——第一坑
第三個式子Number().getNumber(),當執(zhí)行Number()后返回了this,此時指向的是Window,則這是相對于執(zhí)行了this.getNumber(),而內部函數關系式的上下文為window,所以執(zhí)行內部函數
第四個式子還是執(zhí)行內部函數,如果看到這還不明白,可以試著把第三個式子拆分為Number()和getNumber()再F12調試看this,你就明白了——第二坑
第五個式子new了靜態(tài)函數,即調用了靜態(tài)函數
第六個、第七個式子都是實例對象的成員方法
以上均是本人通過個人理解與查閱資料而來,如果有錯誤的地方請指出,謝謝?。?br> 另外覺得文章寫得不錯的話可以點贊并關注我哦~