Call和Apply的详解(未完待续)

138 阅读2分钟

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 排版