###函数参数arguments共享问题
在JavaScript中,传进来的函数参数可以用函数上下文里的内部对象arguments访问[^footnote].。它包括如下属性:
: callee:指向当前函数的引用,
: length : 实际传递进来的参数的个数
: properties-indexes (字符串类型的整数) 属性的值就是函数的参数值(按参数列表从左到右排列)。 properties-indexes内部元素的个数等于arguments.length. properties-indexes 的值和实际传递进来的参数之间是共享的
> 所以,我们一般通过arguments[0]这种形式可以访问到传进来函数的参数值,实际上是通过arguments的properties-indexes属性来访问。根据properties-indexes属性的定义,arguments[0]这种访问函数参数的方式只能和实际有传进来的参数共享,对于那些函数声明定义里面存在却在函数执行时未真正传进来的参数,不能与arguments[0]这种方式共享。
<html>
<body>
<script type="text/javascript">
function foo(x, y, z) {
console.log("[x]"+x);//[x] 10
arguments[0] = 450;
console.log("[x]"+x);//[x] 450
console.log(y); // undefined
y = 30;
arguments[1] = 50;
console.log(y); // 30
}
foo(10);
</script>
</body>
</html>
在上面代码中我们看到,我们在函数中传进来一个参数x的值,在函数内部通过arguments[0]这种方式去改变函数参数的值,只有对x的改变生效,当使用 arguments[1]的方式去改变y的值,发现改变后不能和y共享。
注意,在严格模式下,x的值将始终为10
刚开始了解学习ecmascript规范相关的新人
[^footnote]: http://dmitrysoshnikov.com/ecmascript/ru-chapter-2-variable-object/