普通函数this VS 箭头函数this
- 普通函数中的this表示调用此函数时的对象,可以通过bind,call,apply,改变this指向
- 箭头函数没有自己的this,箭头函数并不会创建其自身的执行上下文,所以箭头函数的this取决于它的外部函数
它的this是从自己的作用域链的上一层继承而来,默认指向在定义它是所处的对象(宿主对象的this),bind,call,apply只能调用传递参数,不可修改this指向
let x=11
let obj = {
x:22,
methods:{
x:33,
say: function(){
console.log(this.x)
},
say1: ()=>{
console.log(this.x)
}
}
}
obj.methods.say() // 33 普通函数this表示调用此函数时的对象即methods对象
obj.methods.say1() //11 say1中this所在的外层代码块是methods对象,methods对象中的this此时是windows
var btn={}
btn.onclick = function(){
setTimeout(function(){
console.log(this) // this指向window
},100)
setTimeout(() => {
console.log(this) // 在定义的时候this已将绑定至宿主函数的this即btn对象
},1000)
}
btn.click()
let obj2 = {
a: 10,
b: function(n) {
let f = (n) => n + this.a;
return f(n);
},
c: function(n) {
let f = (n) => n + this.a; // this指向obj2, call改变不了其指向
let m = {
a: 20
};
return f.call(m,n);
}
};
console.log(obj2.b(1)); // 11
console.log(obj2.c(1)); // 11
call apply bind 区别
功能上是没有区别,都是改变this的指向,主要区别在于方法的实现和参数传递上的不同。 call 和 apply都是在调用后立即执行。而bind调用之后需要再调用一次
①:函数.call(对象,arg1,arg2....)
②:函数.apply(对象,[arg1,arg2,...])
③:var ss=函数.bind(对象,arg1,arg2,....)