前言
對于方法執(zhí)行的順序亿絮,講真在面試時(shí)遇到這題目一開始挺開心的鼠锈,畢竟自己也大概了解,但是這題考察的并不是一個(gè)知識(shí)點(diǎn)那么簡單晨抡,再加上在原型的問題上繞來繞去地可以說十分磨心態(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();//普通函數(shù)
Number().getNumber();//執(zhí)行Number()后執(zhí)行內(nèi)部函數(shù)
getNumber();//普通函數(shù)
new Number.getNumber();//靜態(tài)方法的實(shí)例
new Number().getNumber();//實(shí)例對象的方法
new new Number().getNumber();
正確的答案:
1
3
0
0
1
2
2
第一個(gè)Number.getNumber()
靜態(tài)方法饲鄙,沒有任何爭議凄诞;
第二個(gè)getNumber()
圆雁,則涉及到函數(shù)執(zhí)行的預(yù)編譯問題,在預(yù)編譯中執(zhí)行:
如果遇到執(zhí)行的是function
帆谍,則會(huì)先以查找原型鏈的方式查找到方法伪朽,并執(zhí)行;但如果想題目這種有function
和函數(shù)表達(dá)式var
汛蝙、let
烈涮、const
等,則會(huì)先執(zhí)行function
的方法窖剑,即上面所說的查找原型鏈坚洽,因此這里先執(zhí)行了
function getNumber() {
console.log(4)
}
而后執(zhí)行
var getNumber=function () {
console.log(3)
}
那么,預(yù)編譯完成后則先執(zhí)行的function
被函數(shù)表達(dá)式覆蓋西土,而執(zhí)行的是函數(shù)表達(dá)式的方法——第一坑
第三個(gè)式子Number().getNumber()
讶舰,當(dāng)執(zhí)行Number()
后返回了this
,此時(shí)指向的是Window需了,則這是相對于執(zhí)行了this.getNumber()
跳昼,而內(nèi)部函數(shù)關(guān)系式的上下文為window
,所以執(zhí)行內(nèi)部函數(shù)
第四個(gè)式子還是執(zhí)行內(nèi)部函數(shù)肋乍,如果看到這還不明白鹅颊,可以試著把第三個(gè)式子拆分為Number()
和getNumber()
再F12調(diào)試看this
,你就明白了——第二坑
第五個(gè)式子new
了靜態(tài)函數(shù)墓造,即調(diào)用了靜態(tài)函數(shù)
第六個(gè)堪伍、第七個(gè)式子都是實(shí)例對象的成員方法
以上均是本人通過個(gè)人理解與查閱資料而來,如果有錯(cuò)誤的地方請指出觅闽,謝謝5酃汀!
另外覺得文章寫得不錯(cuò)的話可以點(diǎn)贊并關(guān)注我哦~