【问题标题】:Is it ok to use an argument named "arguments" in JavaScript?可以在 JavaScript 中使用名为“arguments”的参数吗?
【发布时间】:2014-11-29 20:50:08
【问题描述】:

我正在编写一个公开以下函数的库

function call(instance, func, arguments) {
  return {
    call: {
      instance: instance,
      func: func,
      arguments: arguments
    }
  }
}

名称arguments 可以使用吗?这确实是它的最佳名称,但我不想与内置变量发生冲突。它在节点中工作。这是否适用于所有浏览器和 JavaScript 环境?

编辑:

请注意,上述函数在 Node.js 中按预期工作。我想知道的是这是否适用于任何地方。

除非有技术原因,否则我宁愿不重命名它。我真的很喜欢这个面向外部的函数和反映这个参数名称的文档,因为返回的对象将被序列化为 JSON 并跨语言使用。

【问题讨论】:

    标签: javascript naming


    【解决方案1】:

    在“草率模式”下可以使用名称arguments,但不推荐。

    严格模式下是禁止的,如果作者关心代码质量,所有新代码都应该使用它。

    function a(arguments) {
        console.log(arguments);
    }
    a(1);
    // Prints "1"
    
    (function () {
        'use strict';
        function a(arguments) {
            console.log(arguments);
        }
        a(1);
    }());
    // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
    

    这类似于将变量命名为“对象”。也许在某些晦涩的上下文中使用该名称是有意义的,但是这样做您将无法访问全局Object 对象和它上面的有用方法,例如Object.keys。同样,通过做出这种糟糕的命名决定,您将无法再操纵 arguments 对象,它在 JS 中是可变参数。

    为了提高代码的可维护性,最好避免创建像这样的定时炸弹。在严格模式下不允许使用它有一个很好的理由:它可能会给任何想要使用 arguments 的人带来痛苦。

    【讨论】:

    • 严格模式很重要,因此重用名称在技术上是不可行的。感谢这个例子。
    【解决方案2】:

    好像被拍了。 arguments 是一种快速、类似数组的方式来获取函数的所有参数。请参阅this 解释它。

    也许您可以改用parameters

    编辑:为了了解这个变量是如何工作的,我写了这个:

    function sayHelloTo(objectToSayHiTo){
      alert("Hello "+arguments[0]+"!");
    }
    
    sayHelloTo("world");

    编辑 #2:

    显然不会受到影响:

    function sendGreetings(name, arguments){
        alert("I'm "+name+"!");
        for(var count=0;count<arguments.length;count++){
          alert("Hello "+arguments[count]+"!");
        }
    }
    
    sendGreetings("kittycat3141", ["world", "StackExchange", "Joe"]);

    但是,我还没有尝试所有的浏览器。

    编辑#3 我尝试了 5 种主流浏览器(IE、Chrome、Safari、Firefox 和 Opera),上面的代码运行正常。 但是,正如 iCobot 在 cmets 中所说,最好不要使用内置名称,因为它可以为您和任何阅读代码的人节省以后的困惑和挫败感。

    【讨论】:

    • @KarolyHorvath 为什么不呢?
    • “这是否适用于所有浏览器和 JavaScript 环境?”。
    • 是的,这就是我关心的对象。我想知道的是我是否仍然可以使用相同的名称尽管内置对象。 (在 Node 中,您可以。)
    • @Joe - 你最好不要使用任何已经内置的词。即使它适用于所有环境,对于可能需要查看你的其他开发人员来说,这只是一种很好的礼仪。代码。甚至你自己也在路上。减少混淆的可能性。
    • @iCobot 我一般同意。然而,在这种情况下,更多的目光将集中在它的外部部分而不是函数内部。这也是一个小功能,所以不应该让那些碰巧偷看的人感到困惑。
    猜你喜欢
    • 2016-12-20
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2017-11-12
    • 2011-01-25
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多