javascript - 函数只接收字符串数组的第一个元素
问题描述
亲爱的程序员
我正在处理过去两个小时一直在尝试调试的异常问题。我正在编写一个 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。
但是当我进入函数的执行时,我只能看到第一个元素。
我确保所有缓存都被删除并且我没有使用过时的代码,但我想不出会导致这种情况的东西。我会非常感谢你在这方面的敏锐头脑。
提前致谢!
解决方案
使用.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);
推荐阅读
- c++ - 从 TVector2 类派生 Complex 类:“没有用于调用 Complex::Complex() 的匹配函数”
- ffmpeg - 使用“-t”的 FFMPEG 输出持续时间太长了 10 毫秒
- git - Bitbucket 管道仅构建以掌握
- python - Keras 模型未正确保存
- python - 根据一列将 pyspark.sql 数据帧拆分为多个表
- django - Django 模板复杂反向查询计数
- qt - 如何在 QML 中的文本框之间进行选项卡导航?
- procmail - 使用 .forward 预处理传入的电子邮件?
- oop - 从 Fortran 中的父类继承分配
- r - 重视我的少数群体会给我带来错误:“不同长度的变量”?