下面我們一起來看看這個this吧。
在我們聲明一個函數(shù)時,每個函數(shù)除了有定義時的parameters(形參),自身還會有額外的兩個參數(shù),一個是this,一個是arguments(實(shí)參)。arguments就是函數(shù)實(shí)際接受到的參數(shù),是一個類數(shù)組。arguments我只做個簡略的介紹,重點(diǎn)我們放在this指針上。
在面向?qū)ο笞兂芍校瑃his十分重要,它的值取決于調(diào)用的模式。而在JavaScript中,一共有4中調(diào)用模式:方法調(diào)用模式、函數(shù)調(diào)用模式、構(gòu)造函數(shù)調(diào)用模式、apply調(diào)用模式。
方法調(diào)用模式
當(dāng)一個函數(shù)是作為一個對象的屬性時,我們通常稱這個函數(shù)是這個對象的一個方法。當(dāng)這個方法被調(diào)用時,this就會指向該方法所屬對象。
代碼如下:
代碼如下:
var people = {
name : "people-Yika",
student : function(){
var self = this; //將this緩存起來
function sayName(){
var name = "sayName-Yika";
console.log(self.name); //"people-Yika",此時的self指向的是people對象
};
sayName();
}
}
構(gòu)造函數(shù)調(diào)用模式
JavaScript里一講到構(gòu)造函數(shù),腦海里就會有:“函數(shù)名大寫!調(diào)用的時候要用new操作符!” 函數(shù)名大寫好理解,是為了規(guī)范統(tǒng)一構(gòu)造函數(shù)的命名。可是你有沒有深究過為什么要用new呢?如果在一個函數(shù)前面帶上new來調(diào)用,那么函數(shù)后臺會創(chuàng)建一個指向該函數(shù)prototype的新對象,同時this也綁定在新對象上。JavaScript是一門基于原型繼承的語言,對原型prototype不是很清楚的同學(xué)可以自己去查一下資料,我重點(diǎn)放在this上面。
我們先來看看構(gòu)造函數(shù)一般長什么樣子。
代碼如下:
輸出
}
}
var Yika = new People("Yika");
Yika.sayName(); //輸出“Yika" ,因為Yika是通過new調(diào)用得來的,this都綁定在了Yika對象上。
script>
乍一看,好像不是好懂,怎么剛才在函數(shù)里的this是指向window,現(xiàn)在不用緩存就可以指向People函數(shù)呢?
沒關(guān)系,剛才不是說函數(shù)通過new調(diào)用,會在背地里自己做“做壞事”么,我們一起看看到底做了哪些事。
代碼如下:
輸出"Yika"
script>
這樣看就明白清楚了吧,new不僅會生成一個對象,而且還會自動return這個對象,這樣自然this便指向了這個新對象。
千萬記得要用 new 去調(diào)用構(gòu)造函數(shù),不然出了問題,是沒有警告的,所有大寫約定還是十分有必要的。
Apply調(diào)用模式
apply方法讓我們構(gòu)建一個參數(shù)數(shù)組傳遞給調(diào)用函數(shù),也允許我們改變this值。
function.apply(this綁定的值, arguments參數(shù)數(shù)組)
apply可以說的東西太多了,我這里只舉個的栗子來幫助大家理解:
代碼如下:
輸出“Yika”
script>
我們可以通過apply輕易的修改函數(shù)的this綁定對象,和apply相似的方法call也有一樣的效果,有興趣的同學(xué)可以自己搜索學(xué)習(xí)一下。
好了,總算講完改變this的四種調(diào)用模式了,方法調(diào)用模式和構(gòu)造函數(shù)調(diào)用模式會用的更多,也會更重要一點(diǎn),而函數(shù)調(diào)用模式,我們則要學(xué)會避開其中的陷阱。
若有錯誤,請及時反映,我會盡快糾正,以防誤導(dǎo)他人,謝謝!
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com