这是合法的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没有宏。正确地做到这一点,即将变量传递给函数,然后将其返回到对象中,然后在调用者中将其提取出来,与复制/粘贴调节器函数的代码几乎一样多。     
已邀请:
        在EcmaScript 3和EcmaScript 5非严格条件下有效,但在EcmaScript 5严格模式下无效。它适用于所有现代浏览器和大多数旧浏览器。它不能在严格模式下工作,例如在带有
\"use strict\"
指令的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为   论点。    基本上,
arguments
对象为每个索引获取一个设置器,因此分配给
arguments[i]
会更改位置
i
的命名参数的值。规范中有语言,反之亦然。 这在任何解释器中都应该在非严格模式下工作
(function (x) {
  alert(\"x=\" + x + \", arguments[0]=\" + arguments[0]);  // Both should be 0
  arguments[0] = 1;
  alert(\"x=\" + x + \", arguments[0]=\" + arguments[0]);  // both should be 1
  x = 2;
  alert(\"x=\" + x + \", arguments[0]=\" + arguments[0]);  // both should be 2
 })(0);
但是,如果使用use strict指令在Firefox 5上运行上述代码,则会得到不同的行为:
(function (x) {
  \"use strict\";

  alert(\"x=\" + x + \", arguments[0]=\" + arguments[0]);  // Both should be 0
  arguments[0] = 1;
  alert(\"x=\" + x + \", arguments[0]=\" + arguments[0]);  // x=0, arguments[0]=1
  x = 2;
  alert(\"x=\" + x + \", arguments[0]=\" + arguments[0]);  // x=2, arguments[0]=1 
 })(0);
    
        
arguments
是类似数组的对象,但是仍然是对象。因此,当您将其作为参数传递给另一个函数时,它将通过引用传递。因此,当您更改任何值时,它们也会在原始“ 2”对象中发生变化。因此,这将按照您的建议进行。据我所知,所有浏览器都支持通过引用传递对象,但是在EcmaScript 5严格模式下,名为属性的参数对象索引不再动态映射到命名的形式参数,因此这行不通。     
        是的,其中“所有浏览器”是现代的,启用Java的浏览器的合理列表。     
        请参阅下面的编辑-这不适用于此问题,但仍然适用:在JavaScript中,仅复杂类型(对象和数组)通过引用传递。基本类型(字符串,数字和布尔值)按值传递;更改参数只会影响局部函数中的该变量。
var primitive = 1;
var complex = { prop: 1 };

function func1() {
    change(primitive, complex);
    // primitive == 1
    // complex == { prop: 2 }
}

function change(a,b) {
    a++;
    b.prop++;
}
编辑:我想念您正在传递
arguments
对象。快速测试在Chrome 13,IE 9,Firefox 4和Opera 10.62中产生的结果相同。     
        由于在调用
func1()
时未传递
c
,因此不会将其包含在参数中。因此,在
change_em()
中设置
args[2] = []
也不会在父功能中设置
c
。     

要回复问题请先登录注册