关于javascript:函数只接收字符串数组的第一个元素

Function receives only first element of String array

本问题已经有最佳答案,请猛点这里访问。

亲爱的程序员们

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

1
2
3
4
5
6
7
8
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)
}

}

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

1
2
3
4
5
function updateAvailableBlocks(args) {
availableBlocks = []
for(i=0; i < args.length; i++) {
    availableBlocks[i] = args[i];
}

}

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

Debugger view inside triggerEvents()

但当我单步执行函数时,我只能看到第一个元素。

Debugger view inside upateActiveBlocks()

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

事先谢谢!


.call代替.apply。APPLY将传递数组的参数分散开来,就像一个接一个地传递它们一样。因此,如果您的函数不需要可变数量的参数,并且您没有正确地处理它们,那么它就不会像您期望的那样工作。

1
2
3
4
5
6
7
function foo(arg) {
  console.log(arg);
}

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

或者您可以使用rest操作符和apply来实现相同的效果。

1
2
3
4
5
6
function foo(...arg) {
  console.log(arg);
}

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