this釋義
this
翻譯為上下文踢步,每次我看到這個(gè)解釋都會(huì)產(chǎn)生一種迷糊的感覺姻蚓,也不知道是哪位大神第一個(gè)把this翻譯成這個(gè)意思朵耕,反正猜憎,在第一次看到的時(shí)候元莫,很難了解到this真正的意思卵凑。做了兩年前端弄屡,也經(jīng)常查閱一些與this有關(guān)的資料昼浦,我是贊成把this
解釋為指向當(dāng)前執(zhí)行的環(huán)境,當(dāng)然竭沫,這個(gè)“當(dāng)前”經(jīng)常會(huì)發(fā)生不可預(yù)知的變化燥翅,不過(guò)this
指代執(zhí)行環(huán)境應(yīng)該是沒有問(wèn)題的。
現(xiàn)在來(lái)看看this
具體指向吧蜕提。
this指向
- 作為對(duì)象的方法調(diào)用
- 作為普通函數(shù)調(diào)用
- 構(gòu)造器調(diào)用
-
Function.prototype.call
或者Function.prototype.apply
調(diào)用
1.作為對(duì)象的方法調(diào)用
當(dāng)函數(shù)作為對(duì)象內(nèi)的一個(gè)方法被調(diào)用的時(shí)候森书,this指向擁有該方法的對(duì)象。
var obj = {
a : 1,
getA : function(){
alert(this === obj)//輸出:true
alert(this.a)//輸出:1
}
};
obj.getA();
2.作為普通函數(shù)調(diào)用
當(dāng)函數(shù)不作為對(duì)象的一個(gè)方法時(shí)谎势,即常說(shuō)的普通函數(shù)方式凛膏,這個(gè)時(shí)候,this指向全局對(duì)象window(在瀏覽器的javascript
環(huán)境中)脏榆。
window.name = 'globalName';
var getName = function(){
return this.name
};
console.log(getName());//輸出:globalName
或者:
window.name = 'globalName';
var myObj = {
name : 'jack',
getName : function(){
return this.name;
}
}
var getName = myObj.getName;
console.log(getName());//輸出:globalName
console.log(myObj.getName());//輸出:jack
console.log(myObj.getName);//輸出:function(){return this.name;}//this->window
3.構(gòu)造器調(diào)用
javascript
中沒有類猖毫,不過(guò)可以從構(gòu)造器中創(chuàng)建對(duì)象,同時(shí)也一樣提供了new
運(yùn)算符须喂,這樣使得構(gòu)造器看起來(lái)很像一個(gè)類吁断。
除了js
自帶的一些內(nèi)置函數(shù),大部分js
函數(shù)都可以當(dāng)作構(gòu)造器使用坞生。構(gòu)造器外表看起來(lái)跟普通函數(shù)一模一樣胯府,它們的區(qū)別在于被調(diào)用的方式,當(dāng)用new
運(yùn)算符調(diào)用函數(shù)時(shí)恨胚,該函數(shù)會(huì)返回一個(gè)對(duì)象骂因,通常情況下,構(gòu)造器的this
就指向返回的這個(gè)對(duì)象赃泡。如:
var MyClass = function(){
this.name = 'jack',
};
var obj = new MyClass();
console.log(obj.name);//輸出:jack //this->obj
但是寒波,如果構(gòu)造器顯式的返回一個(gè)對(duì)象,this
則會(huì)指向返回的這個(gè)對(duì)象升熊,而不是我們之前期待的this
:
var MyClass = function(){
this.name = 'jack';
return {
name : 'lily'
}
};
var obj = new MyClass();
console.log(obj.name);//輸出:lily
如果不顯式的返回任何數(shù)據(jù)俄烁,或者返回的不是一個(gè)對(duì)象,就不會(huì)出現(xiàn)上述的問(wèn)題:
var MyClass = function(){
this.name = 'jack';
return 'lily';//返回的是一個(gè)string類型
};
var obj = new MyClass();
console.log(obj.name);//輸出:jack
4.Function.prototype.call或者Function.prototype.apply調(diào)用
跟普通函數(shù)調(diào)用相比级野,使用Function.prototype.call
或者Function.prototype.apply
可以動(dòng)態(tài)的改變this
的指向:
var obj1 = {
name : 'jack',
getName : function(){
return this.name;
}
};
var obj2 = {
name : 'lily'
};
console.log(obj1.getName());//輸出:jack
console.log(obj1.getName.call(obj2));//輸出:lily //改變getName()里面this
寫在最后
call
和apply
方法是javascript
的特色页屠,作為一個(gè)真正的js程序員
,熟練使用這兩個(gè)方法是必要的條件之一蓖柔。下次詳細(xì)的說(shuō)說(shuō)兩個(gè)方法辰企。
ps: 大部分內(nèi)容參考JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐這本書,本人也正在學(xué)習(xí)這本書的知識(shí)况鸣,寫下這些就當(dāng)作做筆記了牢贸。