每一个 Javascript 函数都能在自己作用域内访问一个特殊的变量 - arguments。这个变量含有一个传递给函数的所有参数的列表。 arguments 对象不是一个数组。尽管在语法上它跟数组有相同的地方,例如它拥有 length 属性。但它并不是从 Array.prototype 继承而来,实际上,它就是一个对象。 因此,我们不能直接对 arguments 使用一些数组的方法,例如 push,pop 或 slice 等。 所以为了使用这些方法,我们就需要将其转换为一个真正的数组。
转化为数组
下面的代码将会返回一个包含 arguments 对象所有元素的数组。
Array.prototype.slice.call(arguments); 由于转化的速度很慢,所以在性能要求严格的程序中不建议这样做。
传递参数
下面是一种比较推荐的方法,将 arguments 对象从一个函数传递到另一个函数。
代码如下:
另外还有一个比较巧妙的方法,就是同时使用 call 和 apply 快速创建一个解绑的外层方法。
代码如下:
函数形参和 arguments 属性的关系
arguments 对象为它自身属性和函数的形参都创建了 getter 和 setter 方法。 因此,修改函数的形参会影响对应的 arguments 对象的属性值,反之亦然。
代码如下:
性能问题
arguments 只在两种情况下不会被创建,一是在函数内部被声明为局部变量,二是当做函数的形参。其他情况,arguments 对象总是会被创建。 由于 getter 和 setter 方法总是会随着 arguments 对象的创建而创建,因此使用 arguments 对性能本身几乎没有影响。 然而,有一种情形会严重影响 Javascript 的性能,那就是使用 arguments.callee。
代码如下: