我有这个电话:
function del(Model, modelName, model_id, req, res, next, cb) {
if(req.query.optimisticDelete){
optimisticDelete(arguments);
}
else{
pessimisticDelete(arguments);
}
}
Run Code Online (Sandbox Code Playgroud)
问题当然是,参数没有正确传递给optimisticDelete和pessimisticDelete函数.
在一个理想的JS世界中,这可能有用,但我很容易理解为什么它没有.
但它并没有消除这一事实,我只是不想为每个调用输入所有参数,事实上我也想省略del函数签名中的参数,所以这将是最理想的虽然我需要对req对象的引用,但我现在缺少了:
function del() {
if(req.query.optimisticDelete){
optimisticDelete(arguments);
}
else{
pessimisticDelete(arguments);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当然,当传递参数时,它似乎并没有神奇地分离成单独的参数.
而且,这也不起作用:
function del(Model, modelName, model_id, req, res, next, cb) {
if(req.query.optimisticDelete){
optimisticDelete(Array.prototype.slice.call(arguments));
}
else{
pessimisticDelete(Array.prototype.slice.call(arguments));
}
}
Run Code Online (Sandbox Code Playgroud)
如果您了解我想要做什么,请告诉我是否可能以及如何,
您正在optimisticDelete使用单个参数进行调用,该参数是一个arguments包含原始调用的所有参数的特殊对象.如果你想将它们展开,你需要使用apply:
optimisticDelete.apply(null, arguments);
Run Code Online (Sandbox Code Playgroud)
没有必要先转换arguments为数组.MDN说:
您还可以使用
argumentsargsArray参数.arguments是函数的局部变量.它可以用于被调用对象的所有未指定的参数.因此,在使用该apply方法时,您不必知道被调用对象的参数.您可以使用arguments将所有参数传递给被调用对象.
有两个问题.首先,arguments对象是怪异,但它不是那个怪异.在一个简单的函数调用中,没有什么可以神奇地变成参数列表.但是,Function.prototype.apply最终你想要的是什么.
首先,你会想arguments变成一个普通的数组:
var plainArgs = Array.prototype.slice.call(arguments);
Run Code Online (Sandbox Code Playgroud)
或者,如果您关心运行时效率:
var plainArgs = [];
for (var i = 0; i < arguments.length; ++i)
plainArgs[i] = arguments[i];
Run Code Online (Sandbox Code Playgroud)
(注意 - 这个步骤可能没有必要,但是将arguments对象从函数中传递出来往往会使优化者抛弃他们的小手并放弃你的功能.)
(另一个注意事项 - 完全忽略了传递arguments给.apply()坏人的事情.我错了.)
有了这个,你可以使用.apply():
optimisticDelete.apply(null, plainArgs);
Run Code Online (Sandbox Code Playgroud)
该.apply()函数期望其第二个参数是一个数组.该数组成为函数的各个参数.第一个参数.apply()是你想this在函数调用中使用的值; 因为你optimisticDelete()在原始代码中称之为"裸体",所以我通过了null,但你可以通过你想要的任何东西.