我正在编写一个公开以下函数的库
function call(instance, func, arguments) {
return {
call: {
instance: instance,
func: func,
arguments: arguments
}
}
}
名称arguments
可以使用吗?它确实是最好的名字,但我不想与内置变量发生冲突。它适用于Node。这适用于所有浏览器和JavaScript环境吗?
修改
请注意,上述函数在Node中按预期工作。我想知道这是否会在任何地方都有用。
除非有技术原因,否则我宁愿不重命名。我真的很喜欢这个面向外部的函数和文档来反映这个参数名称,因为返回的对象将被序列化为JSON并在各种语言中使用。
答案 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;
但是,我还没有尝试过所有浏览器。
编辑#3 我尝试了5种主流浏览器(IE,Chrome,Safari,Firefox和Opera),上面的代码运行正常。 然而,正如iCobot在评论中所说,最好不要使用内置名称,因为它可以为您和任何阅读代码的人节省您的困惑和挫折感。