Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 被JS'完全弄糊涂了;参数';独特性_Javascript - Fatal编程技术网

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