【问题标题】:Function receives only first element of String array [duplicate]函数仅接收字符串数组的第一个元素[重复]
【发布时间】:2018-10-26 13:33:53
【问题描述】:

亲爱的程序员们

我正在处理过去两个小时一直在尝试调试的异常问题。我正在编写一个 Web 前端,它从使用 window.apply 函数执行的服务器接收命令。 triggerEvents 函数用于处理所有不同的命令,并将从服务器发送的参数传递给相应的函数(参见下面的代码)。

function triggerEvents(commands){
for (var index = 0; index < commands.length; index++){
    var command = commands[index];
    console.debug("execute");
    console.debug(command);
    console.debug(command.arguments);
    window[command.function].apply(null, command.arguments)
}

}

一般来说效果很好,但是,一个特定的函数(下一个代码清单)被传递一个字符串数组,但由于某种原因,函数中只有第一个元素可用。

function updateAvailableBlocks(args) {
availableBlocks = []
for(i=0; i < args.length; i++) {
    availableBlocks[i] = args[i];
}

}

现在,当我检查调试器时,我可以确认我确实收到了来自服务器的字符串数组,并且该特定数组已按预期传递给 window.apply。

但是当我进入函数的执行时,我只能看到第一个元素。

我确保删除了所有缓存并且我没有使用过时的代码,但我想不出会导致这种情况的原因。非常感谢您在这方面的敏锐头脑。

提前致谢!

【问题讨论】:

  • args 将只是传递给updateAvailableBlocks 的第一个参数。
  • 对于您的案例表现这种方式的原因的详细信息,apply 将获取您的参数数组并使用您的数组中的单独参数触发函数(第一个数组元素将是第一个参数, second 将是第二个参数,等等)

标签: javascript arrays frontend


【解决方案1】:

使用.call 代替.apply。 Apply 传播传递数组的参数,就好像它们被一一传递一样。因此,如果您的函数不希望有可变数量的参数并且您没有正确处理它们,那么它就不会像您期望的那样工作。

function foo(arg) {
  console.log(arg);
}

const arr = ['a', 'b', 'c'];
foo.apply(null, arr);
foo.call(null, arr);

或者您可以使用rest 运算符和apply 来达到相同的效果。

function foo(...arg) {
  console.log(arg);
}

const arr = ['a', 'b', 'c'];
foo.apply(null, arr);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 2020-09-19
    • 2021-03-29
    • 2021-11-02
    • 2022-08-12
    • 2021-01-04
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多