这是合法的JavaScript吗?将参数传递给函数并对其进行更改
|
这合法吗?并且在所有浏览器中都可以使用吗?
function func1(a, b, c) {
//b == 2 here
change_em(arguments);
//b should equal 3 here
}
function change_em(args) {
args[0] = 6;
args[1]++;
args[2] = [];
}
func1(\'foo\', 2);
如果您想知道,我需要调整函数中的参数。宏将是完美的,除非javascript没有宏。正确地做到这一点,即将变量传递给函数,然后将其返回到对象中,然后在调用者中将其提取出来,与复制/粘贴调节器函数的代码几乎一样多。
没有找到相关结果
已邀请:
5 个回复
辰炔诚薯
指令的Firefox 5中运行时。 根据EcmaScript 5规范的第10.6.11.c.ii节 10.6参数对象 ... 如果strict为false,并且name不是mappedNames的元素,则 将名称添加为列表mappingNames的元素。 令g为使用参数调用MakeArgGetter抽象操作的结果 名称和环境 令p为使用参数调用MakeArgSetter抽象操作的结果 名称和环境 调用传递给ToString(indx)的地图的[[DefineOwnProperty]]内部方法, 属性描述符{[[Set]]:p,[[Get]]:g,[[Configurable]]:true},false为 论点。 基本上,
对象为每个索引获取一个设置器,因此分配给
会更改位置
的命名参数的值。规范中有语言,反之亦然。 这在任何解释器中都应该在非严格模式下工作
但是,如果使用use strict指令在Firefox 5上运行上述代码,则会得到不同的行为:
搂腹时
是类似数组的对象,但是仍然是对象。因此,当您将其作为参数传递给另一个函数时,它将通过引用传递。因此,当您更改任何值时,它们也会在原始“ 2”对象中发生变化。因此,这将按照您的建议进行。据我所知,所有浏览器都支持通过引用传递对象,但是在EcmaScript 5严格模式下,名为属性的参数对象索引不再动态映射到命名的形式参数,因此这行不通。
嗓瑰
泉秘胁
编辑:我想念您正在传递
对象。快速测试在Chrome 13,IE 9,Firefox 4和Opera 10.62中产生的结果相同。
秃拳割
时未传递
,因此不会将其包含在参数中。因此,在
中设置
也不会在父功能中设置
。