调用对象定义了一个特殊的属性,名称arguments,它实际上引用了一个特殊对象Arguments对象,因为Arguments属性是调用对象的一个属性,因此它的状态和局部变量以及形参是相同的。arguments.length可以获取传递给参数的实参数量
废话不多少,例子说明一切
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
function f(x,y,z)
{
if (f.length !=arguments.length)
{
//可以通过读取函数的length和arguments的length属性值来检查形式参数的数量是否相等
//因为前者恰好是形参的数量,而后者是实参数量
//如果不相等抛出异常
throw new Error('function f called with' +arguments.length+'arguments,but it expects'+f.length+'arguments');
}
else
{
document.write("f("+[x,y,z]+')'+'<br/>');
}
}
try
{
f(1,2,3);
f(2,4);//抛出异常,后面的将不再执行
f(4);
f("a","b","c","d","e","f");
}
catch (ex)
{
document.write(ex.message);
}
//-->
</SCRIPT>
</BODY>
</HTML>
运行结果:
f(1,2,3)
function f called with2arguments,but it expects3arguments
arguments的行为有点想数组,但它其实并不是数组,它不具备JavaScript核心数组的一些方法如join、sort、slice等
一个使用arguments对象那个接收任意参数的例子
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
function f()
{// 利用arguments来读取任意个数的参数
document.write("f(" +Array.apply(null,arguments) + ")" +"<br/>");//apply()应用某一对象的一个方法,用另一个对象替换当前对象。
}
f(1,2,3);
f("a","b");
f(true);
//-->
</SCRIPT>
</BODY>
</HTML>
一个使用arguments对象模拟函数重载的例子
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
function Point()
{
if(arguments.length ==0)//如果没有参数
{
//默认的xy属性都设置0
this.x=0;
this.y=0;
this.toString=function()
{
return this.x+" "+ this.y ;
}
}
else if (arguments.length <2)//如果实参小于2
{
var p=arguments[0];
if (p instanceof Point )//判断实参类型如果是Point,那么执行属性复制
{
this.x =p.x;
this.y =p.y
this.toString=function()
{
return this.x+" "+ this.y ;
}
}
else if ( typeof p=="number" || p instanceof Number)//如果是数值,那么这个值作为当前Point的x属性值,y属性默认0
{
this.x=(Number)(p);
this.y=0;
this.toString=function()
{
return this.x+" "+ this.y ;
}
}
else
{//如果这个参数既不是Point又不是Number,抛出类型异常
throw new TypeError("参数类型错误!")
}
}
else if (arguments.length==2)
{
var x= arguments[0];
var y= arguments[1];
//否则当参数数量为两个并且为number类型的时候,把她们分别作为Point的xy
if ((typeof x=='number' || x instanceof 'Number') && typeof y == 'number' ||y instanceof 'Number')
{
this.x = x;
this.y = y;
this.toString=function()
{
return this.x+" "+ this.y ;
}
}
else
throw new TypeError('参数类型错误!');
}
else
{
throw new TypeError("参数类型错误!");
}
}
function dwn(s)
{
document.write(s+"<br/>");
}
dwn(new Point());//00
dwn(new Point(new Point()));//00
dwn(new Point(3));//30
dwn (new Point(4,5));//45
//-->
</SCRIPT>
</BODY>
</HTML>
需要注意的是:在使用了命名参数的函数中,arguments中的参数也始终是相应命名参数的别名,不管这个参数是值类型还是引用类型,改变arguments中的参与一定会影响到对应的命名参数,反之亦然如:
function f(x)
{
alert(x);//参数初始值
arguments[0]++;//改变参数的值
alert(x);//x的值发生了改变
}
Arguments对象还提供了一个有用的属性叫做callee,它被用来应用当前正在执行的函数,它提供了一种匿名的递归调用能力,这对于闭包说非常有用,如:
用闭包计算10的阶乘
function(x){
return x>1?x*arguments.callee(x-1):1
}(10);
分享到:
相关推荐
在函数定义时没有形参名称时,向函数传递参数的使用方法。 实例演示了arguments对象的使用方法。
Arguments对象作用深度研究.pdf
所有的函数都有一个自己的arguments对象,用来储存它实际接受到的参数,而不局限于函数声明时所定义的参数列表。它不是数组却类似数组,具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值...
利用arguments对象可以实现重载,利用arguments.length可以获取函数的参数个数,如下: 代码如下: function hi(){ if(arguments.length==1){ alert(arguments[0]); } else if(arguments.length==2){ a
本文主要给大家介绍了关于js中arguments对象的相关内容,下面话不多说了,来一起看看详细的介绍吧 一、在函数调用的时候,浏览器每次都会传递进两个隐式参数 函数的上下文对象this 封装实参的对象arguments 二、...
在上篇文章中我们讨论了javascript中的默认参数,这篇文章,我们来讨论下javascript的arguments参数对象。 如下例的一个函数,我们如何根据传入参数的不同来做不同的...arguments对象是一个类数组对象,想了解argume
1、什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,...javascript函数体内,arguments像数组(并不是真的数组,是一个Arguments对象,再次强调)一样,有length属性,可以代表
arguments对象:函数对象内,自动创建的专门接收所有参数值得类数组对象。 arguments[i]: 获得传入的下标为i的参数值 arguments.length: 获得传入的参数个数! 重载: 程序中可定义多个相同函数名,不同参数列表...
JavaScript中arguments函数对象是该对象代表正在执行的函数和调用它的函数的参数。JavaScript 函数中 arguments 为特殊对象,无需明确指出参数名,就能访问它们。
所有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数。他不是一个数组,如果用typeof arguments,返回的是’object’。虽然我们可以用调用数据的方法来调用arguments。比如length,还有index方法。...
js函数体内可以通过arguments对象来接收传递进来的参数,利用这一对象属性可以动态传参。 function box() { return arguments[0]+' | '+arguments[1]; //得到每次参数的值 } alert(box(1,2,3,4,5,6)); //...
arguments 对象 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。 例如,在函数 sayHi() 中,第一个参数是 message。用 arguments[0] 也可以访问这个值,即第一个参数的值(第一个...
ECMAScript中的函数并不介意传递的参数有多少,也不介意是什么类型。由于JavaScript允许函数有不定数目的参数,所以我们需要...这就是arguments对象的由来。这篇文章将详细介绍Javascript中的arguments对象和使用方法。
迭代器(iterator)是一个可以顺序存取数据集合的对象。其一个典型的API是next方法。该方法获得序列中的下一个值。...然后里面的迭代器对象来遍历arguments对象的元素。 初步编码 function values(){ var i=
实际上,函数体内可以通过 arguments 对象来接收传递进来的参数。 代码如下: function box() { return arguments[0]+’ | ‘+arguments[1]; //得到每次参数的值 } alert(box(1,2,3,4,5,6)); //传递参数 ...
js 中不存在函数的重载,但却可以通过arguments对象实现对象的重载,下面有个不错的示例,大家可以参考下
js函数不介意定义多少参数,也不在乎传递进来多少参数,也就是说,即使定义的函数只接收2个参数,在调用时候也未必传递2个参数,因为js的函数参数在内部使用一个数组表示的,在函数体内可以通过arguments对象访问此...