apply方法可显式绑定this并以数组传参,语法为func.apply(thisArg, [args]),立即执行且要求第二参数为数组或类数组,适用于参数不定、借用方法等场景。

使用 apply 方法可以显式绑定函数执行时的 this,同时把参数以数组形式传入,适合参数数量不确定或已组织成数组的场景。
apply 的基本语法和 this 绑定原理
apply 是函数对象的方法,调用格式为:func.apply(thisArg, [arg1, arg2, ...])。第一个参数决定函数内部 this 指向谁;第二个参数必须是数组(或类数组对象),它的每一项会作为独立参数依次传给函数。
- 如果
thisArg是null或undefined,非严格模式下指向全局对象(如浏览器中是window),严格模式下保持null/undefined - 若传入的不是数组,会抛出
TypeError -
apply立即执行函数,不返回新函数 —— 这点区别于bind
用 apply 精准控制 this 并传入数组参数
当需要让函数在特定上下文中运行,并把一组值展开为参数时,apply 是最直接的选择。例如操作数组方法、借用他人方法、或动态调用带不定参的函数。
- 借用
Math.max求数组最大值:Math.max.apply(null, [3, 7, 2])→7(因为Math.max不依赖this,所以传null即可) - 让普通函数在指定对象上执行:
myFunc.apply(obj, argsArray),此时myFunc内部的this就是obj - 模拟事件处理器绑定:
handler.apply(button, eventArgs),确保this指向按钮元素
常见陷阱与安全写法
直接用 apply 容易忽略环境兼容性或参数类型问题,尤其在旧浏览器或处理类数组时。
- 类数组对象(如
arguments、NodeList)可直接传给apply,但现代写法更推荐转成真数组:Array.from(arguments)或[...arguments](ES6+) - 避免
func.apply(this, arguments)在箭头函数中使用 —— 箭头函数没有自己的this和arguments,会报错或取外层值 - 若参数数组可能为空,注意目标函数是否支持零参数调用;必要时加判断:
args.length ? func.apply(ctx, args) : func.call(ctx)
对比 call 和 bind,明确 apply 的不可替代性
三者都用于绑定 this,但适用场景不同:call 要求参数逐个列出,bind 返回新函数且不立即执行,而 apply 唯一支持「数组解包传参 + 立即执行」的组合。
- 需要把
[1, 2, 3]当作三个独立参数传给sum(a, b, c)?只能用apply或扩展运算符(sum(...[1,2,3])) - 想复用别人对象上的方法,比如
array.push.apply(otherArray, [x, y]),等价于otherArray.push(x, y) - 在封装工具函数时,若接收参数数组并转发给底层函数,
apply是最简洁可靠的方案

















