You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中能否在Function.call()方法中传入数组参数?

能否给call方法传入数组作为参数?

当然可以!虽然call()方法本身的设计是接收逐个列举的独立参数,而非数组,但我们可以借助一些语法技巧,实现和apply()一样用数组传参的效果。

最简便的方式:ES6展开运算符(...)

ES6的展开运算符可以直接把数组“拆解”成单个参数,完美适配call()的参数要求。结合你给出的代码示例,我们可以这样修改:

function Product(name, price) {
  this.name = name;
  this.price = price;
}
function Food(name, price) {
  // 定义一个参数数组
  const productParams = [name, price];
  // 用展开运算符把数组拆成call需要的单个参数
  Product.call(this, ...productParams);
  this.category = 'food';
}
console.log(new Food('cheese', 5).name); // 输出: "cheese"

这段代码的效果和使用Product.apply(this, productParams)完全一致,只是用call()配合展开运算符实现了数组传参。

ES5环境的兼容写法

如果你的代码需要兼容不支持ES6的旧环境,可以通过嵌套调用apply()来实现:

function Product(name, price) {
  this.name = name;
  this.price = price;
}
function Food(name, price) {
  const productParams = [name, price];
  // 借助Function.prototype.call的apply方法间接传数组
  Function.prototype.call.apply(Product, [this].concat(productParams));
  this.category = 'food';
}
console.log(new Food('cheese', 5).name); // 输出: "cheese"

这里的逻辑是:apply()会把第二个参数的数组拆成目标方法(这里是call())的参数,[this].concat(productParams)就拼成了call()需要的「上下文对象 + 逐个参数」的完整列表。

小结

call()本身不直接支持数组参数,但通过ES6展开运算符或者ES5的嵌套apply技巧,就能轻松实现和apply()一致的数组传参能力,按需选择即可。

内容的提问来源于stack exchange,提问作者Shrirang Kadale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:22:41