今天在群里面,蚂蚁问了一些关于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
结果: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对象的创建。。
callee…我记住了