简介

apply() 的原型链是 Function.prototype.apply()

apply() 方法调用一个具有给定 this 值的函数,以及以一个数组(或类数组对象)的形式提供的参数。

语法

func.apply(thisArg, [argsArray])

参数

thisArg

必选的。在 func 函数运行时使用的 this 值。请注意,this 可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。

argsArray

可选的。一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。如果该参数的值为 nullundefined,则表示不需要传入任何参数。从ECMAScript 5 开始可以使用类数组对象。 浏览器兼容性 请参阅本文底部内容。

返回值

调用有指定 this 值和参数的函数的结果。

使用场景

当我们想指定或改变函数内部的 this 值时。

示例代码

  1. let that = { name: 'bob' };
  2. function fn(a, b, c) {
  3. console.log(this);
  4. console.log(`a:${a}\nb:${b}\nc:${c}`);
  5. };
  6. fn.apply(that, [1, 2, 3]);

分析

这里我们首先声明了 that 变量用来表示 this 的值,而后声明了一个普通函数,然后在函数内部打印了 this 以及参数 abc 的值,最后使用 apply() 方法调用 fn 函数。
我们看到第一个参数为 that,他最后变成了 fn 函数内部的 this 值,而后面的 [1, 2, 3] 是一个数组,最后的输出为:
image.png
可以看到 fn 函数内部的 this 值为外部传入的 that,即 fn.this = that,而参数 a、b、c 对应的值也为 1、2、3,在语法的参数解释中,我们知道, [1, 2, 3] 将作为单独的参数传给 fn 函数

这个函数十分强大,还有更多的用法,具体可以参阅 MDN 示例

注意

由于箭头函数没有自己的 this,所以当然也就不能用 call()、apply()、bind() 这些方法去改变 this 的指向。
简单说就是使用 apply() 方法的函数必须是一个普通函数,不能是箭头函数,箭头函数改变不了 this 的指向。
可以看到上面示例代码中, fn 函数就是一个普通函数,这是必须的。