arguments 详解

特性:
1 arguments 对象不是一个真正的数组,它类似于数组,没有数组所特有的属性和方法,除了length。例如没有pop 方法。不过可以将其转换为数组

var args = Array.prototype.slice.call(arguments); 
//为什么不用 arguments.slice(0);

因为:能用slice方法的,只要有length属性就行。虽然arguments有length属性,但是没有slice方法,所以呢,Array.prototype.slice()执行的时候,Array.prototype已经被call改成arguments了,因为满足slice执行的条件(有length属性),所以没有报错。

2 arguments 对象仅在函数内部有效,在函数外部调用arguments对象会报错误。
属性

arguments.callee 指向当前指向的函数
arguments.caller 指向调用当前函数的函数,但是此已经不存在了,在非严格模式下可以用function.caller。
arguments.length 指向传递给当前函数的参数数量(实参)
arguments.callee.length 指向当前函数的形参数量(形参)

应用场景:当调用一个函数时候,这个函数的参数数量比它显示声明的参数数量多的时候。
例如:1 检查参数的个数 2模拟函数重载
严格模式
1 function.caller,function.arguments 报错
2 arguments.callee 报错
3 arguments 不再追踪参数的变化

function f(a) {
 a = 2;
 return [a, arguments[0]];
}
f(1); // 正常模式为[2,2]
function f(a) {
 "use strict";
  a = 2;
 return [a, arguments[0]];
}
f(1); // 严格模式为[2,1]

你可能感兴趣的:(arguments 详解)