apply 和call
this在标准函数和箭头函数中有不同的行为,标准函数中,this引用的是「把函数当成方法调用的,上下文对象」,所以要看this指向谁,得先看当前函数在哪里被调用,然后他的上下文是谁,this指向的就是谁
例子1:
window.color = 'red';
let o = {
color: 'blue'
};
function sayColor() {
console.log(this.color);
}
sayColor(); // 'red'
o.sayColor = sayColor;
o.sayColor(); // 'blue'
小结:sayColor()时,函数在window里调用,上下文是window,所以他的this指向window,然后把这个函数放进o对象中,然后再调用o对象的方法,这时候,方法在o对象中执行,上下文是o对象,所以this指向这里,取到了对象o里的color
- 回调函数的this指向并非想要的对象,此时将回调函数写成箭头函数就可以解决问题,因为箭头函数中的this会保留定义该函数的上下文
caller
- 这个属性引用的是,调用当前函数的函数,也就是当前函数被谁调用了,这个属性指向的就是那个谁,如果在全局作用域调用,则为null
apply和call
- 两个方法都会指定this值来调用函数,会设置调用函数体内this对象的值,
- apply()方法接受两个参数:函数体内this的值,和一个参数数组
- 第二个参数可以是Array的实例,也可以说arguments对象
例子1:
function sum(num1, num2) {
return num1 + num2;
}
function callSum1(num1, num2) {
return sum.apply(this, arguments); // 传入arguments对象
}
function callSum2(num1, num2) {
return sum.apply(this, [num1, num2]
); // 传入数组
}
console.log(callSum1(10, 10)); // 20
console.log(callSum2(10, 10)); // 20
小结:总结来说就是this这个对象,调用sum这个对象的方法,A.apply(B,arguments);也就是B对象调用A对象的方法,然后B对象的参数传过去,
- 区别:call和apply的区别在于,传递的参数不同,apply最多两个参数,call可以多个参数,
本文使用 mdnice 排版