-
this
對(duì)象是在運(yùn)行函數(shù)時(shí)基于函數(shù)的運(yùn)行環(huán)境綁定的轰异;全局環(huán)境中坎怪,this
對(duì)象就是window
罢坝,而當(dāng)函數(shù)被作為某個(gè)對(duì)象的方法調(diào)用時(shí),this
就是那個(gè)對(duì)象(例如全局調(diào)用搅窿,函數(shù)就作為window
的方法)
- 在理解
this
對(duì)象前先統(tǒng)一下函數(shù)調(diào)用的寫法func.call(context,p1,p2)
嘁酿,this
就是這個(gè)context
function funcAdd(a,b){
console.log(a+b);
}
funcAdd.call(undefined,1,2); //3
//瀏覽器的規(guī)則是如果你傳的context是null或者undefined隙券,那么window對(duì)象就是默認(rèn)的context嚴(yán)格模式下默認(rèn) context是undefined),此時(shí)可簡(jiǎn)寫為funcAdd.call(1,2);
var obj = {
name: "Asher",
age: 3,
show: function(){
console.log( this.name + ":" + this.age )
}
};
obj.show.call(obj); //Asher:3 這里的this就是obj對(duì)象
var john = {
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!");
}
john.sayHi = func; //相當(dāng)于給對(duì)象john添加了func方法
john.sayHi(); //彈出對(duì)話框 John:hi!闹司,該語句相當(dāng)于john.sayHi.call(john);john是當(dāng)前的this
func(); ////彈出window娱仔,全局調(diào)用;相當(dāng)于func.call();
function func() {
alert(this);
}
function fn0(){
function fn(){
console.log(this);
}
fn();
}
fn0(); //window;fn()是全局調(diào)用
document.addEventListener('click', function(e){
console.log(this); //document游桩,事件綁定時(shí)觸發(fā)的DOM對(duì)象指向this
setTimeout(function(){
console.log(this); //window;全局調(diào)用
}, 200);
}, false);
var john = {
firstName: "John";
}
function func() {
alert( this.firstName );
}
func.call(john); //彈出John牲迫,這里指定了john就是this
var john = {
firstName: "John",
surname: "Smith"
}
function func(a, b) {
alert( this[a] + ' ' + this[b] );
}
func.call(john, 'firstName', 'surname');
//彈出John Smith
//指定this和調(diào)用的對(duì)象為john,'firstName', 'surname'為傳給func的實(shí)參
var $btn = $('.btn');
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this); //當(dāng)$btn發(fā)生點(diǎn)擊事件時(shí)盹憎,this指向$btn這個(gè)DO對(duì)象
this.showMsg();
})
},
showMsg: function(){
console.log('饑人谷');
}
}
//修改后:
var $btn = $('.btn');
var module= {
bind: function(){
var $this = this;
$btn.on('click', function(){
console.log(this);
$this.showMsg();
})
},
showMsg: function(){
console.log('饑人谷');
}
}
var obj = {
foo: function(){
console.log(this)
}
}
var bar = obj.foo;
obj.foo(); //輸出obj;相當(dāng)于obj.foo.call(obj);this就是obj
bar(); // 輸出window;沒有指定context谓娃,那么默認(rèn)為undefined即window
function fn (){ console.log(this) }
function fn2(){}
var arr = [fn, fn2];
arr[0](); //輸出arr
//這里的arr[0]可以理解為arr.0蜒滩,所以轉(zhuǎn)換為arr.0.call(arr);