繁体   English   中英

arguments数组与在javascript中指定参数

[英]arguments array vs. specifying parameters in javascript

我正在查看一个javascript库,并注意到你可以使用参数数组访问传递给函数的参数,如此...

function foo() {
    var firstArg = arguments[0];
    var secondArg = arguments[1];
    //code
}

我一直通过在函数定义中指定参数来完成此操作

function foo(firstArg, secondArg) {
    //code
}

阅读函数参数的这两种策略有哪些优点/缺点?

通常,您应该使用命名参数,其优点是您需要更少的代码,并且可以编写更多自记录的函数声明。

如果您不知道函数将使用多少个参数,则arguments对象(虽然不是数组,但它类似于数组)很有用。 例如:

function sum () {
  var result = 0;
  for ( var i = 0; i < arguments.length; i++)
    result += +arguments[i];
  return result;
}

该函数可以称为sum(1)sum(1,2,3,4,5)

第二个明确命名参数,这有助于通信。

我几乎从未见过第一种方法。 更常见的是看到一个附加(命名)参数,该参数接受一个没有明确命名的其他参数的对象。 相对于手动访问arguments ,将是高度首选的IMO。

直接访问arguments的好处是你不需要做任何特殊的事情来传递任意数量的参数。 缺点是你现在依赖于位置参数,这在一段时间内基本上是不可能记住的,特别是当有几个时。

除极少数情况外,我认为访问arguments几乎没有现实世界的优势。

我一直喜欢为函数指定参数,因为它更易读和清楚。 特别是我不喜欢使用arguments [],因为我不知道谁是参数或arguments [0]。

但是,如果我需要将很多参数传递给函数?

在这种情况下建议,考虑一下你的功能,它可能会打破单一责任原则的概念。 而阅读清洁代码书将有所帮助。

这是我的意见。

如果您确定参数,则无需为它们声明变量,并且代码将更易于理解。

如果您可能需要可变数量的参数,那么arguments数组(它实际上不是真正的javascript数组)会很有用。 像这样:

function sum() {
    var args = Array.prototype.slice.call(arguments); // turns the arguments array-like structure into a real array
    var total = 0;
    args.forEach(function(n) { total += n;});
    return total;
}

另一种用途是在你想要将所有参数传递给另一个函数而不单独识别它们的情况下(如果函数参数在将来发生变化或者在变量数量的参数的情况下会发生变化,这将是一个问题),例如:

function sumTimes3() {
    return sum.apply(this, arguments) * 3;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM