STPace's Studio.

js 中函数参数的疑问

Word count: 648 / Reading time: 3 min
2018/10/18 Share

疑问

在重新仔细读JavaScript高级程序设计时,读到函数的理解参数部分遇到一个问题。原文:

1
2
3
4
function doAdd(num1, num2){
arguments[1] = 10;
alert(arguments[0] + num2);
}

每次执行这个函数都会重写第二个参数,将第二个参数的值修改为 10。因为 arguments 对象中的值会自动反映到对应的命名参数,所以修改 arguments[1],也就修改了 num2,结果它们的值都会变成 10。不过,这并不是说读取这两个值会访问相同的内存空间;它们的内存空间是独立的,但它们的值会同步。但这种影响是单项的:修改命名参数不会改变 arguments 中的值。

这最后的单项影响,我的理解就是:arguments 的修改会影响到命名参数的改变,反之命名参数的修改不会对 arguments 产生影响。然后写了个下面的代码测试了一下。

验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function fun1(num1, num2, num3, num4){
console.log('1th: ', num1, num2, num3, num4, arguments);
// 1th: 111 222 333 undefined { '0': 111, '1': 222, '2': 333 }
arguments[1] = 122;
num3 = 133;
arguments[3] = 144;
console.log('2th: ', num1, num2, num3, num4, arguments);
// 2th: 111 122 133 undefined { '0': 111, '1': 122, '2': 133, '3': 144 }
num4 = 244;
console.log('3th: ', num1, num2, num3, num4, arguments);
// 3th: 111 122 133 244 { '0': 111, '1': 122, '2': 133, '3': 144 }
}
var n1 = 111;
var n2 = 222;
var n3 = 333;
fun1(n1,n2,n3);
console.log(n1, n2, n3)
// 111 222 333

在 fun1 中,导入参数三个分别是 111, 222, 333
1th:打印数据可以看到命名参数 num1, num2, num3 就是导入参数的值,num4 未导入而未 undefined,arguments 对象也反映了三个导入参数。

2th:打印数据之前,通过修改 arguments 对象的方式修改了 arguments[1],和 arguments[3]。
打印后看到 num2 反映出了 arguments[1] 的改变。
num4 并不会因为添加了 arguments[3] 而改变,还是 undefined。
但是,通过修改命名参数,修改的 num3 打印出的 arguments 对象看到 arguments[2] 也变成了133
这与之前我理解的所谓 单项影响 是不一样的。

3th:对于未导入的参数,修改命名参数 num4 并不会改变 arguments[3]。

总结

arguments 对象是根据导入参数确定的,函数内对于有导入的参数(非 undefined),无论修改命名参数还是修改 arguments 对象,相互都会同步值。
而对于未导入的参数,如例中的 num4,它和 arguments[3] 就如高设中所说是独立的内存空间彼此修改不会互相同步。

CATALOG
  1. 1. 疑问
  2. 2. 验证
  3. 3. 总结