简介
apply() 的原型链是 Function.prototype.apply()
apply() 方法调用一个具有给定 this 值的函数,以及以一个数组(或类数组对象)的形式提供的参数。
语法
func.apply(thisArg, [argsArray])
参数
thisArg
必选的。在 func 函数运行时使用的 this 值。请注意,this 可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。
argsArray
可选的。一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。如果该参数的值为 null 或 undefined,则表示不需要传入任何参数。从ECMAScript 5 开始可以使用类数组对象。 浏览器兼容性 请参阅本文底部内容。
返回值
使用场景
示例代码
let that = { name: 'bob' };
function fn(a, b, c) {
console.log(this);
console.log(`a:${a}\nb:${b}\nc:${c}`);
};
fn.apply(that, [1, 2, 3]);
分析
这里我们首先声明了 that 变量用来表示 this 的值,而后声明了一个普通函数,然后在函数内部打印了 this 以及参数 a、b、c 的值,最后使用 apply() 方法调用 fn 函数。
我们看到第一个参数为 that,他最后变成了 fn 函数内部的 this 值,而后面的 [1, 2, 3] 是一个数组,最后的输出为:
可以看到 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 函数就是一个普通函数,这是必须的。