ECMAScript标准中,每个函数都有一个特殊的内置对象arguments。arguments对象是一个类Array对象(object),用以保存函数接收到的实参副本。

一、内置特性

说它是一个内置对象是因为我们在创建函数时并没有定义这个对象:

var funcTest =function(args){
console.log(arguments); //{‘a’}
}
funcTest(‘a’);
console.log(funcTest.arguments);

直接调用funcTest.arguments输出的结果是null,这一点更可以说明arguments的内置性,当函数开始执行时才能调用到该对象。

二、arguments保存的是函数的实参副本

在声明一个函数时,函数内部会开辟内存空间用以存储形式参数的变量(指针),这一过程是在定义函数时完成的;而arguments是依据传入的实参而开辟内存空间用以存储实参副本,这一过程是在调用函数时发生的。两者并没有在同一内存空间中存储变量的值。

1,当实参数量等于形参数量时,两者中的值是同步的:

function funcTest(a,b)
{
alert(a); //1
alert(arguments[0]); //1
a='11’;
alert(a); //11
alert(arguments[0]); //11
arguments[0]='22’;
alert(a) //22
}
funcTest(‘1’,'2’);

2,有时它们的值并不同步:

function funcTest(a,b,c)

{
alert(arguments[0]); //1
alert(c); //undefined
c=’3’;
alert(arguments[2]); //undefined
}
funcTest(‘1’,'2’);

arguments对象根据传入的实参顺序来与实参的值进行同步,如果该顺序(index)中没有传入实参则不同步。

3,仅仅是保存实参的副本:

function funcTest(a,b)
{
alert(arguments[2]) //undefined
arguments[2]=”1”;
alert(arguments[2]); //undefined
}
funcTest(‘1’,’2’);

在使用arguments对象时, 在函数内部并不能通过使用arguments[n]的形式来开辟新的内存空间用以保存变量的值,也不能通过该方法增加arguments中的变量数。arguments在函数被调用后即开辟内存空间,该空间数目依据实参数量而来,不可更改。

三、arguments的属性

1,length属性

arguments.length返回对象中存储的变量的长度

2,callee 方法

arguments.callee返回函数自身的引用

var funcTest=function(){
alert(funcTest===arguments.callee); //true
}

arguments.callee指向函数自身的引用,这在使用匿名函数时会比较有用。

我们可以利用arguments.callee来创建一个递归函数:

function funcTest(n){
if(n<=1){
return 1;
}else{
return n*arguments.callee(--n);
}
}

也可以用来判断参数数目:

function funcTest(a,b){
if(arguments.length!=arguments.callee.length){
alert(‘传入的参数数目不足!’);
}
}

四、将arguments对象转换成数组(Array)

开篇语里提到arguments对象是一个类数组对象,是因为它有一些特性和数组很相似,比如有length的属性和类似数组的索引器访问内部变量的特性。但实际上它并不是一个真正的数组。我们可以通过下面的方式将它转换成一个真正的数组:

var  arr=Array.prototype.slice.call(arguments);

最新文章

  1. virtual memory exhausted: Cannot allocate memory
  2. [Android Pro] 常用的android工具类和库
  3. TypeScript 自动编译
  4. openfire xmpp 登录参数解析
  5. php导出excel封装类
  6. String字符串
  7. super
  8. Git的常用命令的使用方法和解释
  9. php编译安装参数说明
  10. 一个处理Date与String的工具类
  11. vector中删除第k个元素的巧妙方法
  12. 外网访问内网SpringBoot
  13. Python图像处理之图片文字识别(OCR)
  14. 最近关于mysql的造型,binlog使用,以及阿里云上线数据处理错误导致被处罚的思考
  15. ON 子句和 WHERE 子句的不同
  16. Informatica_(1)安装
  17. hdu 1754(基础线段树) I Hate It
  18. a label can only be part of statement and a declaratioin is not a statement
  19. android 内部存储 安装apk
  20. LeetCode 84. Largest Rectangle in Histogram 单调栈应用

热门文章

  1. Cobalt Strike之HTA木马
  2. 『现学现忘』Docker基础 — 31、实现MySQL同步数据
  3. AVRmega16&#160;LED&#160;例程
  4. 题解P0006:生日蛋糕(P1731)
  5. kafka消费组创建和删除原理
  6. 用TLS/SSL保证EMQ的网络传输安全
  7. eclipse开发工具之“指定Maven仓库和setting.xml文件位置”
  8. servlet中的ServletConfig对象
  9. 【论文简读】 Deep web data extraction based on visual
  10. 何使用派生类指针指向基类,即downcast向下转型?