Javascript 被JS'完全弄糊涂了;参数';独特性
我接到这个电话:Javascript 被JS'完全弄糊涂了;参数';独特性,javascript,Javascript,我接到这个电话: function del(Model, modelName, model_id, req, res, next, cb) { if(req.query.optimisticDelete){ optimisticDelete(arguments); } else{ pessimisticDelete(arguments); } } 当然,问题是参数没有正确地传递给optimisticDelete和悲观delete
function del(Model, modelName, model_id, req, res, next, cb) {
if(req.query.optimisticDelete){
optimisticDelete(arguments);
}
else{
pessimisticDelete(arguments);
}
}
当然,问题是参数没有正确地传递给optimisticDelete和悲观delete函数
在一个理想的JS世界中,这可能会起作用,但我很容易理解为什么它不起作用
但这并没有消除我只是不想为每个调用键入所有参数的事实,事实上我也想省略del函数签名中的参数,因此这将是最理想的情况,尽管我需要对req对象的引用,但我现在缺少了:
function del() {
if(req.query.optimisticDelete){
optimisticDelete(arguments);
}
else{
pessimisticDelete(arguments);
}
}
但当然,当参数被传递时,它似乎不会神奇地分离成单独的参数
而且,这也不起作用:
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));
}
}
如果您理解我想做什么,请告诉我是否可能以及如何使用单个参数调用
optimisticDelete
,这是一个参数特殊对象,包含原始调用的所有参数。如果要将它们展开,需要使用apply:
optimisticDelete.apply(null, arguments);
不必先将参数
转换为数组。说:
您还可以对argsArray参数使用参数
。参数是函数的局部变量。它可以用于被调用对象的所有未指定参数。因此,在使用apply
方法时,您不必知道被调用对象的参数。您可以使用参数
将所有参数传递给被调用对象
有两个问题。首先,参数
对象很奇怪,但也没那么奇怪。在一个简单的函数调用中,没有任何东西会神奇地变成参数列表。然而,这里有函数.prototype.apply
,这是您最终想要的
但是,首先要将参数
转换为普通数组:
var plainArgs = Array.prototype.slice.call(arguments);
或者,如果您关心运行时效率:
var plainArgs = [];
for (var i = 0; i < arguments.length; ++i)
plainArgs[i] = arguments[i];
.apply()
函数期望其第二个参数是数组。该数组将成为函数的各个参数。.apply()
的第一个参数是您希望this
在函数调用中采用的值;因为您在原始代码中调用了optimisticDelete()
“裸”,所以我传递了null
,但是您可以传递任何您想要的信息。optimisticDelete.apply(null,Array.prototype.slice.call(arguments))
@BenTaber在将参数
与应用
一起使用之前,您不需要将其转换为数组。阅读参数
是这个问题的一个很好的开始,然后搜索之前的问题将是最好的后续操作。您不必首先将其转换为数组。而应用()
与call()
几乎相同,根本区别在于call()
接受参数列表,而apply()接受参数列表
接受单个参数数组。@Sphvn问题是参数
对象的语义很奇怪,因为参数
的索引元素是函数实际参数的别名,因此无法进行静态分析。如果将参数
传递给另一个函数,V8根本不会尝试优化函数。我怀疑其他优化器出于同样的原因也会以同样的方式运行。@Sphvn@Pointy,这篇文章中有趣的一点,特别是,永远不要直接使用没有.length或[I]的参数(严格地说,x.apply(y,参数)是可以的,没有其他的,例如,slice.Function#apply是特殊的)
这是否意味着像Barmars answer中那样使用apply
不会影响优化?根据ECMAScript 2015,将参数转换为列表,列表的结构似乎比数组简单得多。因此,作为–传递参数的一个很好的理由是,不要浪费时间将其转换为无论如何都会转换为列表的数组。;-)
optimisticDelete.apply(null, plainArgs);