【问题标题】:Javascript named function parameters vs arguments objectJavascript命名函数参数与参数对象
【发布时间】:2010-09-15 10:37:29
【问题描述】:

如果我有这样的功能:

function doStuff(arg) {
   arguments[0] = "4" + arg;
   console.log(arg);
   console.log.apply(null, arguments);
}

显然doStuff("name") 打印了两次“4name”。

argarguments[0] 指向同一个东西吗?我可以互换使用它们吗? javascript 在内部做了什么我应该注意的事情吗?有什么陷阱吗?

我知道参数处理传递的所有参数,而不仅仅是命名参数。我只关心它如何处理第一个(或第 n 个)参数。

[编辑]

我实际上是用这个作为

function name(arg) {
   arguments[1] = args;
   arguments[0] = "[INFO] " + args.callee + " arg: %o";
   console.log.apply(this, arguments);
}

并在函数本身中调用name(arguments)。有趣的是,args.callee 打印出的是函数源代码而不是函数名。

【问题讨论】:

    标签: javascript arguments


    【解决方案1】:

    参数“array”存在于任何函数上下文中,并枚举当前上下文调用接收到的参数。是的 arguments[0] 是指给定的第一个参数,因此如果您将其标记为“名称”,它将是同一件事。

    参数对于处理未定义数量的参数(即参数列表)、元编程,甚至在您想要强加一些启发式方法来确定哪些参数代表什么类型的数据(即您不信任实现者)时都非常强大),但至少可以说这是一个相当有限的用例。

    我强烈建议您避免依赖参数数组,原因有两个:

    1)。索引位置不是一个非常安全的机制来依赖 this 数据实际上意味着你认为它是什么,也不是一个灵活的机制来处理变化。

    2)。如果您删除命名参数,您实际上是在破坏信息。尽管 JS 函数签名不像其他语言那样严格,但对于任何试图了解函数实际作用的人来说,它仍然是至关重要的信息。 JS 是一种语言,表达能力真的真的很重要。

    所说的参数包含其他有趣的属性,例如“被调用者”,这将为您提供一些相当大的权力来完成其他方式无法完成的事情。这值得你自己研究(很好的起点here)。

    还有一个更严重的问题,即参数本身处于一种奇怪的半弃用、半支持状态,因此在使用它时确实需要经过 x 浏览器测试并注明以供将来考虑。

    没有我知道的内部问题。

    【讨论】:

    • arguments 对象本身作为函数内的局部变量不被弃用。
    • 谢谢,如果调用不正确,该函数会出现奇怪的行为。我可以处理。我主要将参数与 .apply 和 arguments.callee 函数结合使用,因此使用起来很重要。
    【解决方案2】:

    是的,您可以互换使用它们。

    这里有一个关于如何使用arguments 的好文档: https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments

    【讨论】:

      【解决方案3】:

      是的,arguments[0]arg 指向同一个东西,改变一个会改变另一个。 ECMAScript 5(目前逐渐进入主流浏览器)稍微改变了一些事情:在严格模式下,命名参数和arguments 对象之间的关联更加松散,因为arguments 中的值只是命名参数的副本。来自 ECMAScript 5 的第 10.6 节:

      对于严格模式函数,参数对象的属性值只是传递给函数的参数的副本,属性值和形参值之间没有动态链接。

      【讨论】:

      • 开发人员应该提前考虑并尝试应对 ECMAscript 5 的更改,还是仅在实施更改破坏它时才修复它。
      • @Raynos - 永远领先 ;) 如果您知道,那么这绝对是您可以计划的问题。