箭头函数可以用 call 或者 apply 改变 this 指向吗 ?(百度)
不可以,call和apply改变this指向的本质是将函数当成call或apply的第一个参数的方法来调用。
在手写call方法中,context添加了一个属性,属性值就是函数,函数已经成为了对象身上的方法。
const key = Symbol();
// call是一个普通函数,内部的this指向调用call方法的对象
// 把调用call方法的对象绑定成 call方法第一个参数的方法
context[key] = this;
在普通函数中,对象调用方法,那么this指向的就是对象,但是箭头函数没有this,所以也就不会指向对象,而是指向函数声明所在的作用域中,
下面的代码更能直观看出本质
const obj = {
a: 1,
b: 2,
};
function sum(a, b) {
console.log(this.a + this.b);
}
sum.call(obj, 4, 5);
调用了call方法就相当于obj身上添加了一个sum方法
const obj = {
a: 1,
b: 2,
sum:function(a,b){
console.log(this.a + this.b);//this指向的是obj对象
}
}
};
如果是箭头函数
const obj = {
a: 1,
b: 2,
};
const sum = (a,b) => {
console.log(this.a + this.b);
};
sum.call(obj, 4, 5);
sum函数调用了call方法也是相当于在obj对象上添加了一个方法
const obj = {
a: 1,
b: 2,
sum:(a,b)=>{
console.log(this.a + this.b);//this指向的是window
}
}
};
面试中要求手写call方法:
<script>
var a=1;
var b=2;
var obj={
a:0,
b:1
}
function sum(){
console.log(this.a+this.b);
}
Function.prototype._call=function(context,...args){
console.log(this);
var key=Symbol();//生成唯一的属性,防止重名
context[key]=this;//给对象添加方法
//这里就相当于
// context[key]=function(){
// console.log(this.a+this.b);
// }
//参数问题
var result=context[key](...args);//调用方法
delete context[key];//将添加的属性删除
return result;//返回函数的返回值
}
sum._call(obj,9,8);
</script>
箭头函数和普通函数的区别(招银、百度、知乎、字节)
- this指向,普通函数this指向调用他的对象,而箭头函数没有this
- 箭头函数没有原型对象prototype属性
- arguments参数,箭头函数没有arguments参数。如果需要接受对应的实参列表,可以用 rest 剩余参数
- 箭头函数不能用做构造函数