千鋒教育JavaScript全套視頻教程(10天學(xué)會(huì)Js,前端javascrip

this是Javascript語言的一個(gè)關(guān)鍵字。
它代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用。
1、常用的四種情況
1)全局性調(diào)用,因此this就代表全局對(duì)象Global。
function test(){
this.x = 1;
alert(this.x);
}
test(); // 1
2)作為對(duì)象方法的調(diào)用
函數(shù)還可以作為某個(gè)對(duì)象的方法調(diào)用,這時(shí)this就指這個(gè)上級(jí)對(duì)象。
function test(){
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1
3)作為構(gòu)造函數(shù)調(diào)用
所謂構(gòu)造函數(shù),就是通過這個(gè)函數(shù)生成一個(gè)新對(duì)象(object)。這時(shí),this就指這個(gè)新對(duì)象
function test(){
this.x = 1;
}
var o = new test();
alert(o.x); // 1
4)apply調(diào)用
apply()是函數(shù)對(duì)象的一個(gè)方法,它的作用是改變函數(shù)的調(diào)用對(duì)象,它的第一個(gè)參數(shù)就表示改變后的調(diào)用這個(gè)函數(shù)的對(duì)象。因此,this指的就是這第一個(gè)參數(shù)。
var x = 0;
function test(){
alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0
apply()的參數(shù)為空時(shí),默認(rèn)調(diào)用全局對(duì)象。因此,這時(shí)的運(yùn)行結(jié)果為0,證明this指的是全局對(duì)象。
如果把最后一行代碼修改為
o.m.apply(o); //1
運(yùn)行結(jié)果就變成了1,證明了這時(shí)this代表的是對(duì)象o。
apply()會(huì)改變this的對(duì)象,如果括號(hào)里沒有值,對(duì)象按全局算,如果有對(duì)象,則按括號(hào)里面的算。
2、回調(diào)函數(shù)的this指向
var o = {
??age : 12,
??say : function() {
????function callback() {
??????return this.age;
????}
????func(callback);
??}
};
function func(callback) {
??var name = "Xiao Ming";
??console.log(name + " is " + callback() + " years old.");
}
o.say();
代碼分析:這里創(chuàng)建了一個(gè)單例對(duì)象【o】和一個(gè)普通函數(shù)【func】,【o】中有一個(gè)方法【say】,在方法【say】里面調(diào)用了函數(shù)【func】,并傳入了一個(gè)回調(diào)函數(shù)【callback】作為參數(shù),【callback】中返回了對(duì)象【o】的屬性【age】。當(dāng)執(zhí)行到函數(shù)【func】時(shí),打印的結(jié)果如下:
console.log(name + " is " + callback() + " years old.");??//Xiao Ming is undefined years old.
1
我們可以看到【func】中執(zhí)行的回調(diào)函數(shù)【callback】的返回結(jié)果是“undefined”而非“12”。?
原因如下:函數(shù)內(nèi)部的【this】指向于此函數(shù)的調(diào)用者(擁有者)。在上面這個(gè)例子中,雖然【callback】函數(shù)定義于對(duì)象【o】的【say】方法中,但實(shí)際上由于【callback】是在【func】函數(shù)中進(jìn)行的普通調(diào)用,那么【func】中的【callback】的調(diào)用者我們便可以理解為是【window】對(duì)象,因此,【callback】中的【this】便指向了【window】,而在全局作用域中由于并不存在變量【age】,所以“this.age”(即“window.age”)便不存在,就返回了“undefined”。這里多說一點(diǎn):既然變量【age】不存在,那么在使用一個(gè)未定義的變量時(shí)怎么沒有報(bào)錯(cuò)(即“Uncaught ReferenceError: age is not defined”)呢?因?yàn)椋@里是“return this.age”(在這里相當(dāng)于“return window.age”)而非“return age”,即當(dāng)使用一個(gè)對(duì)象的未定義的屬性時(shí)不會(huì)報(bào)錯(cuò),并返回“undefined”,而直接使用一個(gè)未定義的變量時(shí)便會(huì)報(bào)錯(cuò)。