我們平時在寫代碼的時候肯定少不了和this打交道,我們都認爲this是指向自己,但是這句話其實是不完全正確的,可以看下面的代碼:
function show(){
var a = 10;
console.log(this.a);
}
show();
這段代碼並不會像大家想象中那樣輸出一個10,而是輸出undefined,這是爲什麼呢,推翻了大家心中的this指向自己這個說法。再看下面這段代碼:
function show(){
var a = 10;
console.log(this.a);
}
var a = 'golbal';
show(); //輸出golbal
從上面可以看出這個this.a指向的是全局中的a,所以this應該說是指向調用他的那個作用域。
var obj = {
a: function(){
console.log(this); //輸出的是window
},
b:{
x: 20,
func: function(){
console.log(this);
}
}
}
var c = obj.a;
c(); //在window中調用
但是我們想讓他指向自己而不是調用它的那個作用域怎麼辦呢,可以使用call方法
var obj = {
a: function(){
console.log(this);
},
b:{
x: 20,
func: function(){
console.log(this.x);
}
}
}
var c = obj.a;
c.call(obj.b) //這裏會輸出20
c.call(obj.a); //這裏會輸出ƒ (){console.log(this);} a函數本身
使用一個.call()函數就可以改變this的指向。除了這個函數之外還有和call()相同的apply()方法,另一個比較重要的也可以實現類似效果的是bind()方法 這是一個綁定函數。