隨著函數(shù)使用場(chǎng)合的不同野来,this的值會(huì)發(fā)生變化厕鹃。但是有一個(gè)原則,那就是this指的是嬉愧,調(diào)用函數(shù)的那個(gè)對(duì)象
1.作為函數(shù)調(diào)用
在函數(shù)被直接調(diào)用時(shí)this綁定到全局對(duì)象贩挣。在瀏覽器中,window 就是該全局對(duì)象
console.log(this);
function fn1(){
console.log(this);
}
fn1(); //window
內(nèi)部函數(shù)
函數(shù)嵌套產(chǎn)生的內(nèi)部函數(shù)的this不是其父函數(shù)没酣,仍然是全局變量
function fn0(){
function fn(){
console.log(this);
}
fn();
}
fn0(); //window
setTimeout王财、setInterval
這兩個(gè)方法執(zhí)行的函數(shù)this也是全局對(duì)象
document.addEventListener('click', function(e){
console.log(this);
setTimeout(function(){
console.log(this); //window
}, 200);
}, false);
注意 strict mode下,作為函數(shù)調(diào)用 this 就是 undefined
2 作為構(gòu)造函數(shù)調(diào)用
- 所謂構(gòu)造函數(shù)四康,就是通過這個(gè)函數(shù)生成一個(gè)新對(duì)象(object)搪搏。這時(shí),this就指這個(gè)新對(duì)象
- new 運(yùn)算符接受一個(gè)函數(shù) F 及其參數(shù):new F(arguments...)闪金。
- 這一過程分為三步:
(1)創(chuàng)建類的實(shí)例疯溺。這步是把一個(gè)空的對(duì)象的 proto 屬性設(shè)置為 F.prototype 。
(2)初始化實(shí)例哎垦。函數(shù) F 被傳入?yún)?shù)并調(diào)用囱嫩,關(guān)鍵字 this 被設(shè)定為該實(shí)例。
(3)返回實(shí)例漏设。
范例
function Person(name){
this.name = name;
}
Person.prototype.printName = function(){
console.log(this.name);
};
var p1 = new Person('Byron');
var p2 = new Person('Casper');
var p3 = new Person('Vincent');
p1.printName(); \\Byron
p2.printName(); \\Casper
p3.printName(); \\Vincent
3 .作為對(duì)象方法調(diào)用
在 JavaScript 中墨闲,函數(shù)也是對(duì)象,因此函數(shù)可以作為一個(gè)對(duì)象的屬性郑口,此時(shí)該函數(shù)被稱為該對(duì)象的方法鸳碧,在使用這種調(diào)用方式時(shí),this 被自然綁定到該對(duì)象
var obj1 = {
name: 'Byron',
fn : function(){
console.log(this);
}
};
obj1.fn(); \\obj1
注意
var obj1 = {
name: 'Byron',
fn : function(){
console.log(this);
}
};
var fn2 = obj1.fn;
fn2(); \\window
4 DOM對(duì)象綁定事件
在事件處理程序中this代表事件源DOM對(duì)象(低版本IE有bug犬性,指向了window)
document.addEventListener('click', function(e){
console.log(this);
var _document = this;
setTimeout(function(){
console.log(this);
console.log(_document);
}, 200);
}, false);
jQuery Event Handler 中的 this
當(dāng)jQuery的調(diào)用處理程序時(shí)瞻离,this關(guān)鍵字指向的是當(dāng)前正在執(zhí)行事件的元素。對(duì)于直接事件而言乒裆,this 代表綁定事件的元素套利。對(duì)于代理事件而言,this 則代表了與 selector 相匹配的元素鹤耍。
$ul.on('click', 'li' , function(){
console.log(this)
})