一般関数と矢印関数のthisは
12601 ワード
function a(){
console.log(this)
}
a() //Window
document.onclick(function(){
console.log(this)
}) //this
var num = 0;
function Obj (){
this.num = 1,
this.getNum = function(){
console.log(this.num);
},
this.getNumLater = function(){
setTimeout(function(){
console.log(this.num);
}, 1000)
}
}
var obj = new Obj;
obj.getNum();//1 obj.num, 1
obj.getNumLater()//0 window.num, 0
settimeout()によって呼び出されたコードは、その関数から完全に分離された実行環境で実行されます.これにより、これらのコードに含まれるthisキーはwindowがcallとapplyまたはbindを使用してタイマのthisポインタを変更できることを指します.
var num = 0;
function Obj (){
this.num = 1,
this.getNum = function(){
console.log(this.num);
},
this.getNumLater = function(){
setTimeout(function(){
console.log(this.num);
}.bind(this), 1000)
}
}
var obj = new Obj;
obj.getNum();//1 obj.num, 1
obj.getNumLater(this)//0 obj.num, 1
上のコードでbindを使用してタイマのthisの指向を変更したのは、callとapplyがすぐに呼び出されるため、タイマの遅延効果を変更し、タイマは使用されず、bindを使用します.
apply、call、bindの3つは、関数を変更するために使用されるthisオブジェクトの指向である.
apply、call、bindの3つの最初のパラメータは、thisが指すオブジェクト、すなわち指定したいコンテキストです.apply、call、bindの3つはいずれも後続のパラメータを利用してパラメータを伝達することができる.
bindは対応する関数を返し、後で呼び出すのに便利です.apply、callは即時呼び出しです.
var obj ={
a:function(){
console.log(this) //{a: ƒ}
}
}
obj.a()
var obj ={
a:function(){
console.log(this)
},
say:function(){
var _this =this;
setTimeout(function(){
console.log(_this)
})
}
}
obj.a() //{a: ƒ, say: ƒ} //this obj
window.val = 1;
var obj = {
val:2,
dbl:function(){
this.val *=2;
val *=2;
console.log(val) //val val 1*2=2
console.log(this.val) //obj val 2*2=4
}
}
obj.dbl() //2 4
window.val = 1;
var obj = {
val:2,
dbl:function(){
this.val *=2;
val *=2;
console.log(val)
console.log(this.val)
console.log(this) //4 4 window
}
}
var func = obj.dbl;
func(); //func this window
まとめ:1.一般関数のthisはwindow 2を指す.dom要素がバインドされたイベントのthisは要素3を指す.タイマーのthisはwindow(ES 6)4を指す.オブジェクト内のthisはオブジェクト自体を指します
矢印関数のthisは明日補完します
矢印関数this