在JavaScript中使用名为“arguments”的参数是否可以?

时间:2014-11-29 20:50:08

标签: javascript naming

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

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

名称arguments可以使用吗?它确实是最好的名字,但我不想与内置变量发生冲突。它适用于Node。这适用于所有浏览器和JavaScript环境吗?

修改

请注意,上述函数在Node中按预期工作。我想知道这是否会在任何地方都有用。

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

2 个答案:

答案 0 :(得分:7)

可以在“草率模式”中使用名称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对象及其有用的方法,如Object.keys。同样,通过做出这个糟糕的命名决定,你就不能再操纵arguments对象,这是JS中的varargs。

为了提高代码的可维护性,最好避免像这样创建滴答时间炸弹。有一个很好的理由说明它不允许在严格的模式下使用:它可能会给那些想要使用arguments的人带来痛苦,因为它通常被使用。

答案 1 :(得分:4)

看起来好像是这样。 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"]);
&#13;
&#13;
&#13;

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

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