【问题标题】:Pass required argument plus variable length arguments to function将所需参数和可变长度参数传递给函数
【发布时间】:2020-02-15 23:26:21
【问题描述】:

我有一个函数,它有一个必需参数和可变数量的参数。我正在将一组 blob 传递给函数。该函数的简化版本如下所示:

function test(directory, blob0, blob1) {
  for (var argumentIndex = 1; argumentIndex < arguments.length; argumentIndex++) {
    var bytes = arguments[argumentIndex].getBytes();
    //do some things
  }
}

我正在使用 rhino 运行时,所以我不能使用扩展运算符。我最接近的方法是使用 apply 函数,但我不确定如何在上面的测试函数中传递所需的参数(目录)。

var blobs = [];
blobs[0] = getBlob();
blobs[1] = getBlob();
blobs[2] = getBlob();  

test.apply(null,blobs)  //doesn't set required parameter (directory)

【问题讨论】:

  • 我使用的是 rhino 运行时为什么?
  • @TheMaster 只是过于谨慎,因为 Google 最近进行了迁移,我不想花时间追踪潜在的错误。并不是说这些是相关的,但有趣的是最近有一个使用 GAS 设置和获得保护的错误。见这里:issuetracker.google.com/issues/148894990
  • 但这也会影响犀牛。不是吗?在某种程度上,无论您是否迁移,您都会受到影响。

标签: javascript google-apps-script


【解决方案1】:
  • 您希望使用blobs 的数组作为blob0, blob1, blob2test(directory, blob0, blob1, blob2) 的扩展值。
  • 您想通过添加directorytest(directory, blob0, blob1, blob2) 中使用directory

如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

在这个答案中,使用了bind

修改脚本:

// sample getBlob(). This returns a blob.
function getBlob() {return Utilities.newBlob("sample", MimeType.PLAIN_TEXT)}

function test(directory, blob0, blob1, blob2) {
  Logger.log("%s, %s, %s, %s", directory, blob0, blob1, blob2) // <--- directory, Blob, Blob, Blob

  for (var argumentIndex = 1; argumentIndex < arguments.length; argumentIndex++) {
    var bytes = arguments[argumentIndex].getBytes();
    //do some things
  }
}

// Please run this function.
function myFunction() {
  var directory = "directory";

  var blobs = [];
  blobs[0] = getBlob();
  blobs[1] = getBlob();
  blobs[2] = getBlob();

  test.bind(this, directory).apply(null, blobs);
}
  • 在这个修改后的脚本中,directory 使用bind 添加。
  • myFunction()运行时,可以在test(directory, blob0, blob1, blob2)函数中看到directory, Blob, Blob, BlobLogger.log("%s, %s, %s, %s", directory, blob0, blob1, blob2)

参考资料:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

【讨论】:

  • 田池,非常感谢您的彻底回复。这非常有效。
  • @Andrew 感谢您的回复。很高兴您的问题得到解决。
【解决方案2】:

使用unshift()函数,它在数组的开头添加一个元素

var blobs = [];
blobs[0] = getBlob();
blobs[1] = getBlob();
blobs[2] = getBlob();

blobs.unshift(directory)

test.apply(null,blobs)

【讨论】:

  • izambl,感谢您提供另一种方式来实现我的目标。我决定改用 bind(),因为它不会强迫我修改数组或创建另一个数组。此外,MDN 文档特别呼吁对部分应用的函数使用 bind()。
  • 不错,我也觉得.bind是更好的解决办法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多