5

假设我在一个脚本中有 300 个函数。访问每个函数中的参数对象而不是传入命名参数是不是很糟糕?

编辑:好的,你们很多人都在问我为什么要这样做,这确实是一个理论上的问题,但是既然你问我除了可变参数之外还有什么理由要这样做吗?

4

3 回答 3

15

编写难以阅读且他人难以理解、维护或使用的代码是不好的做法。

指定命名参数并尽可能为它们提供有意义、有用、描述性的名称是一种很好的做法。

此外,您应该记住,即使所有参数都不是必需的,您也可以声明命名参数。然后,您可以测试arguments.length以查看传递了多少参数,或者测试特定命名参数的值以查看它们是否传递undefined

在参数变化很大的情况下,您还可以传递一个对象并让对象自行描述传递了哪些参数。

在某些特定情况下,参数对象很有用,并且使用它是编写清晰、简洁和安全代码的最佳方式,但我从未见过所有函数都声明没有命名参数而只使用参数对象的情况。除非您有一些非常不寻常的项目,否则这通常不是为这么多功能编写代码的最佳方式。

就性能而言,访问命名参数似乎比访问所有主要浏览器中的参数对象更快。在这个仅将传递给测试函数的前三个参数相加的jsperf 性能测试中,使用命名参数比使用arguments对象快 2-8 倍。确切的性能差异可能取决于函数试图做什么,但arguments对象肯定看起来更慢。

如果您提供更多信息,说明为什么要使用 arguments 对象而不是命名参数,或者为什么您认为使用 arguments 对象会有益,那么我们可能会提供更具体的建议。

于 2012-11-08T23:16:31.577 回答
3

除了jfriend00的出色回答...

一些现代 Javascript 引擎 [1] 不会创建arguments变量,除非它是

  • 在函数中使用
  • 函数使用eval或类似构造

因此, usingarguments可以简单地通过使用它来减慢功能。

[1] 特别是 Chrome 中的 V8。

于 2012-11-08T23:38:23.363 回答
0

值得注意的是,严格模式会影响 arguments 对象。

在非严格模式下,参数成员被绑定到它们对应的形式参数(如果已经传递了一个值),所以改变一个的值会改变另一个的值。

在严格模式下并非如此。

例如

foo('a');

function foo(arg) {

  // Change the value of arg
  arg = 'b';           

  arg == arguments[0];  // false in strict mode, 
                        // true otherwise
}

此外,arguments.callee 并且arguments.caller在严格模式下不可用。尝试访问它们将引发错误。

于 2012-11-09T02:02:39.827 回答