今天在群里面,蚂蚁问了一些关于this和arguments的问题,把我所认识的arguments总结一下。

当函数内的执行域生成时,arguments对象就被创建了。

arguments对象由所在函数的CreateArgumentsObject方法创建。 这个方法生成了arguments对象,主要是一个list,包含了函数的实参。与函数的形参没有关系,使得不定参数个数的函数成为可能。

例如:

function sum(){

var result=0;

for(var i=0;i<arguments.length;i++){

result+=arguments[i];

}

return result;

}

console.log(sum(1,2,3,4));

结果是10

上文中用了arguments的一个属性length,这个属性的值等于实参的个数。

除此之外,arguments还有个重要的属性,callee

arguments.callee指向函数本身

听起来似乎不好理解。

function ex(){

console.log(arguments.callee);

}

ex();

结果:

function ex(){ console.log(arguments.callee); }

说arguments.callee指向了函数本身。。

这一点很有用,特别在匿名函数的递归中。

var s=function(i){

if(i==1){

return 1;

}

return i*arguments.callee(i-1);

}

console.log(s(3));

结果:6

arguments是一个对象,虽然它像一个数组一样,有length属性,也用数字做下标来表达成员。

有些人将这类的对象,称之为类数组。

function a(){

console.log(arguments instanceof Array);

console.log(arguments instanceof Object);

}

a();

结果:false true

arguments与参数


function fn(a,b,c){

arguments[0]=5;

console.log(a);

}

fn(1,2,3);

结果:5

function fn(a,b,c){
a=5;
console.log(arguments[0]);
}
fn(1,2,3);

结果:5

arguments对象和形参也是一一对应的,修改其中的一个,另一个也会随着改变。。

arguments对象会创建失败吗?会的!

看以下的例子,如果把arguments作为形参会发生什么。

function fn(arguments){

console.log(arguments);

}

fn(1);

结果:1

说明,在arguments对象创建过程中,如果参数名有了叫做arguments的,arguments对象则不会被创建。

那么,如果内部变量名也叫arguments呢?

function fn(){

var arguments=1;

console.log(arguments);

}

fn();

结果:1 ,如果内部存在一个参数,名字也叫arguments,那么aguments对象也不会被创建!

那么,如果是个外部变量呢?

var arguments=1;

function fn(){

console.log(arguments);

}

fn();

结果:[]

外部的arguments变量名,不会影响arguments对象的创建。。