首页 > 解决方案 > 函数只接收字符串数组的第一个元素

问题描述

亲爱的程序员

我正在处理过去两个小时一直在尝试调试的异常问题。我正在编写一个 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。

triggerEvents() 中的调试器视图

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

upateActiveBlocks() 中的调试器视图

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

提前致谢!

标签: javascriptarraysfrontend

解决方案


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

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

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

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

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

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


推荐阅读