如果我有这样的功能:
function doStuff(arg) {
arguments[0] = "4" + arg;
console.log(arg);
console.log.apply(null, arguments);
}
显然doStuff("name")
两次打印“4name”。
arg
和arguments[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打印出函数源代码而不是函数名。
答案 0 :(得分:3)
参数“array”存在于任何函数上下文中,并枚举当前上下文调用所接收的参数。是参数[0]指的是给出的第一个参数,所以如果你把它标记为“名称”,它将是同样的事情。
参数对于处理未定义数量的参数(即参数列表),元编程,甚至是您想要强制使用某种启发式来确定哪些参数代表什么类型的数据(即您不信任实施者) ),但至少可以说这是一个相当有限的用例。
我强烈建议你避免依赖arguments数组,原因有两个:
1)。索引位置不是一个非常安全的机制,依赖这个数据实际上意味着你的想法,也不是一个灵活的处理变更的机制。
2)。如果删除命名参数,则实际上是在破坏信息。尽管JS函数签名与其他语言一样严格,但它仍然是任何试图理解函数实际功能的人的关键信息。 JS是一种表达非常真正很重要的语言。
所述论据包含其他有趣的属性,例如“callee”,这将为你提供一些相当大的力量来做其他事情无法完成的事情。这值得自我调查(良好的起点here)。
还有一个更严重的问题,即参数本身处于一种奇怪的半弃,半支持状态,所以在使用它时需要进行x浏览器测试并注明以供将来考虑。
我没有发现内部陷阱。
答案 1 :(得分:2)
是的,您可以互换使用它们。
这是关于如何使用arguments
的好文档:
https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments
答案 2 :(得分:2)
是的,arguments[0]
和arg
指向相同的内容,更改一个会改变另一个。 ECMAScript 5(目前逐渐进入主流浏览器)略有改变:在严格模式下,命名参数与arguments
对象之间的关联更加宽松,因为arguments
中的值只是命名参数。从ECMAScript 5的第10.6节开始:
对于严格模式函数,arguments对象的属性值只是传递给函数的参数的副本,并且属性值和形式参数值之间没有动态链接。