Javascript命名函数参数与对象参数
如果我有这样的功能:Javascript命名函数参数与对象参数,javascript,arguments,Javascript,Arguments,如果我有这样的功能: function doStuff(arg) { arguments[0] = "4" + arg; console.log(arg); console.log.apply(null, arguments); } 显然,doStuff(“name”)会打印两次“4name” arg和参数[0]是否指向同一事物?我可以互换使用吗。javascript是否在内部做了我应该注意的事情,是否存在任何问题 我知道参数处理的是所有传递的参数,而不仅仅是命名参数。我只关
function doStuff(arg) {
arguments[0] = "4" + arg;
console.log(arg);
console.log.apply(null, arguments);
}
显然,doStuff(“name”)
会打印两次“4name”
arg
和参数[0]
是否指向同一事物?我可以互换使用吗。javascript是否在内部做了我应该注意的事情,是否存在任何问题
我知道参数处理的是所有传递的参数,而不仅仅是命名参数。我只关心它如何处理第一个(或第n个)参数
[编辑]
我实际上是在用这个来做实验
function name(arg) {
arguments[1] = args;
arguments[0] = "[INFO] " + args.callee + " arg: %o";
console.log.apply(this, arguments);
}
在函数本身中调用name(参数)
。有趣的是,args.callee打印出的是函数源代码,而不是函数名。参数“array”存在于任何函数上下文中,并枚举当前上下文调用接收到的参数。Yes arguments[0]引用了给定的第一个参数,因此如果您将其标记为“name”,则它将是相同的
Arguments对于处理未定义数量的参数(即参数列表)、元编程,甚至是您想要施加一些启发来确定哪些参数代表什么类型的数据(即您不信任实现者)非常强大,但至少可以说,这是一个相当有限的用例
我强烈建议您避免依赖arguments数组,原因有两个:
1) 。指数仓位并不是一个非常安全的机制来依赖这些数据——实际上就是你所认为的数据,也不是一个灵活的机制来处理变化
2) 。如果删除命名参数,则实际上是在销毁信息。尽管JS函数签名不像其他语言中的签名那样严格,但对于任何试图理解函数实际功能的人来说,它仍然是至关重要的信息。JS是一种表达能力非常重要的语言
上述参数还包含其他有趣的属性,例如“callee”,它将为您提供一些相当大的能力,使您能够完成其他方法无法完成的事情。这是值得你自己调查的(好的起点)
还有一个更严重的问题,参数本身处于一种奇怪的半弃用、半支持状态,因此在使用它的地方确实需要进行x-browser测试并记录以供将来考虑
我知道没有内部陷阱。是的,您可以互换使用它们 下面是一个关于如何使用
参数的好文档:
是,参数[0]
和arg
指向同一事物,改变一个会改变另一个。ECMAScript 5(目前正逐渐进入主流浏览器)稍微改变了一些事情:在严格模式下,命名参数和参数
对象之间的关联比较松散,因为参数
中的值只是命名参数的副本。摘自ECMAScript 5第10.6节:
对于严格模式函数,arguments对象属性的值只是传递给函数的参数的副本,并且属性值和形式参数值之间没有动态链接
参数
对象本身作为函数中的局部变量未被弃用。谢谢,如果调用不正确,函数将显示奇怪的行为。我能应付。我主要是将参数与.apply和arguments.callee函数结合使用,因此使用它很重要。作为开发人员,应该提前考虑并尝试处理ECMAscript 5的更改,还是只在实现中的更改破坏它时才修复它。@Raynos-始终提前;)如果你知道这一点,那么这肯定是一个你可以计划的问题。