函数只接收String数组的第一个元素

时间:2018-05-16 13:08:54

标签: javascript arrays frontend

亲爱的程序员

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

query:  db.getUsers();


/* 2 */
{
    "_id" : "admin.moiz",
    "user" : "moiz",
    "db" : "admin",
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}

}

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

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)
}

}

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

Debugger view inside triggerEvents()

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

Debugger view inside upateActiveBlocks()

我确保删除了所有缓存,并且我没有使用过时的代码,但我无法想到会导致这种情况的内容。我非常感谢你对此的敏锐思想。

提前致谢!

1 个答案:

答案 0 :(得分:1)

使用.call代替.apply。应用传播传递数组的参数,就像它们被逐个传递一样。因此,如果你的函数没有预期可变数量的参数,而你没有正确处理它们,那么它根本就不会像你期望的那样工作。

&#13;
&#13;
function foo(arg) {
  console.log(arg);
}

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

或者您可以将rest运算符与apply一起使用以达到同样的效果。

&#13;
&#13;
function foo(...arg) {
  console.log(arg);
}

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