Javascrip中每个函数都会有一个Arguments对象实例arguments,它引用着函数的实参,可以用数组下标的方式"[]"引用arguments的元素。arguments.length为函数实参个数,arguments.callee引用函数自身。
arguments他的特性和使用方法
特性:
1.arguments对象和Function是分不开的。
2.因为arguments这个对象不能显式创建。
3.arguments同样具有length属性,arguments.length 为函数实参个数,可以用arguments[length]显示调用参数。
4.每个函数都有一个arguments属性,表示函数的实参集合,这里的实参是重点,就是执行函数时实际传入的参数的集合。arguments不是数组而是一个对象,但它和数组很相似,所以通常称为类数组对象,以后看到类数组其实就表示arguments。arguments对象不能显式的创建,它只有在函数开始时才可用。
5.arguments还有属性callee,length和迭代器Symbol。
使用方法:
虽然arguments对象并不是一个数组,但是访问单个参数的方式与访问数组元素的方式相同(伪数组)
例如:
arguments[0],arguments[1],。。。arguments[n];
在js中 不需要明确指出参数名,就能访问它们,例如:
function logStr() { let ss = ""; for (let i = 0; i < arguments.length; i++) { ss += arguments[i] + ","; } return ss; } logStr("name", "age"); 输出结果: name,age
在严格的模式下,arguments对象在运行的时候不可以修改,修改arguments对象不会影响到实际的函数参数
例如:
function f3(a,b)
{
'use strict';
arguments[0] = 10;
arguments[1] = 20;
return a + b;
}
console.log(f3(3,6)); //9
我们知道每一个对象都有自己的属性,arguments对象也不例外,首先arguments的访问犹如Array对象一样,
用0到arguments.length-1来枚举每一个元素。下面我们来看看callee属性,返回正被执行的 Function 对象,
也就是所指定的 Function 对象的正文。callee 属性是 arguments 对象的一个成员,仅当相关函数正在执行时才可用。
callee 属性的初始值就是正被执行的 Function 对象。实现匿名的递归函数。代码如下:
let sum = function (n) { if (1 == n) { return 1; } else { return n + arguments.callee(n - 1); } } console.log(sum(6)); 输出结果:21
我们说的通俗一点,arguments此对象大多用来针对同个方法多处调用并且传递参数个数不一样时进行使用。根据arguments的索引来判断执行的方法。
知识扩展:
当使用arguments进行函数传递时,有一些需要注意的点。例子如下:
let strLength = 11; function fn() { console.log(this.strLength); } let obj = { method: function(fn) { fn(); arguments[0](); } }; obj.method(fn, 5); 输出:11,2
fn函数里面的this的指向:
1.第一个值为11,执行的是method里面的第一行"fn()",这里this指向的window。所以输出的值为最外层定义的length。
2.第二个值为2,执行的是method里面的第二行"arguments[0]()"(arguments[0]() => fn() ),这里this执行的是arguments这个对象,所以输出值为arguments的长度