我正在查看一个javascript库,并注意到您可以使用参数数组访问传递给函数的参数,如此...
function foo() {
var firstArg = arguments[0];
var secondArg = arguments[1];
//code
}
我总是通过在函数定义
中指定参数来完成此操作function foo(firstArg, secondArg) {
//code
}
这两种阅读函数参数的策略有哪些优点/缺点?
答案 0 :(得分:3)
通常你应该使用命名参数,优点是你拥有更少的代码和更多自我记录的函数声明。
如果你不知道你的函数将被调用多少个参数,那么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)
。
答案 1 :(得分:2)
第二个明确命名参数,这有助于沟通。
我几乎从未见过第一种方法。更常见的是看到一个附加(命名)参数,该参数将一个对象与未明确命名的其他参数一起使用。 IMO比手动访问arguments
更受青睐。
直接访问arguments
的好处是,您不需要做任何特殊的事情来传递任意数量的参数。缺点是你现在依赖于位置参数,这在一段时间内基本上是不可能记住的,特别是当有几个时。
除了极少数情况外,我认为访问arguments
几乎没有现实世界的优势。
答案 2 :(得分:1)
我总是喜欢为我的函数指定参数,因为它更具可读性和清晰度。特别是我不喜欢使用论证[],因为我不知道谁是论据或论据[0]。
但是如果我需要将大量参数传递给函数?
在这种情况下建议,考虑一下你的功能,它可能会打破单一责任原则的概念。阅读Clean Code书将有所帮助。
这是我的意见。
答案 3 :(得分:1)
如果你确定了你的论点,你就不必为它们声明变量,你的代码也会更容易理解。
如果您可能需要可变数量的参数,那么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;
}