Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  javascript  >  正文 javascript arguments传递给函数的隐含参数

javascript arguments传递给函数的隐含参数

发布时间:2015-02-17   编辑:www.jquerycn.cn
本文介绍下,有关javascript arguments的相关知识,arguments作为传递给函数的隐含参数,在关键时刻非常有用,有兴趣的朋友建议参考下。

前言

js是一门脚本语言,其有一个特点就是极其灵活。
有时“灵活”到使即便习惯了c系主流语言的人不得不佩服脚本的强大。

比如本文要讲到的 arguments参数。

本以为就是“变相”的普通参数,只不过不用在定义函数的时候明确声明而已。
不过,代码是廉价的(Code is cheap.)看代码:
 

复制代码 代码示例:
function funcTest(a, b) {
alert(a);
alert(b);
for ( var i = 0 ; i < arguments.length; i ++ ) {
alert(arguments[i]);
}
}
function test() {
funcTest( 1 , 2 , 3 ); // 放到html页进行执行
}
function funcTest(a, b) {
alert(a);
alert(b);
for ( var i = 0 ; i < arguments.length; i ++ ) {
alert(arguments[i]);
}
}
function test() {
funcTest( 1 , 2 , 3 ); // 放到html页进行执行
}
 

代码运行后怎么样,不错,这里的length实在是很奇怪,对不对?

书中这样说明:
“代码运行时会依次显示:1,2,1,2,3。因此,在定义函数的时候,即使不指定参数列表,仍然可以通过arguments引用到所获得的参数,这给编程带来了很大的灵活性”。没有比这句更加精辟的阐释了。

看到这里,可能都有一个疑问(如果你稍微具备一点js编程知识的话),arguments参数是不是js数组对象的一个实例?

以下的示例代码,可以帮你解决这个疑点:
 

复制代码 代码示例:
Array.prototype.testArg = " test arguments " ;
function funcArg() {
alert(arguments.testArg);
}
function test() {
alert( new Array().testArg);
funcArg();
}
Array.prototype.testArg = " test arguments " ;
function funcArg() {
alert(arguments.testArg);
}
function test() {
alert( new Array().testArg);
funcArg();
}
 

代码运行结果:
先弹出"test arguments"和"undefined",为什么funcArg调用返回“undefined”?

来看另外一个有才的设计:
Q:使用递归来计算1 到n 的自然数之和
A1:
 

复制代码 代码示例:
function sum(n) {
if ( 1 == n) return 1 ;
else return n + sum(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html页进行执行
} function sum(n) {
if ( 1 == n) return 1 ;
else return n + sum(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html页进行执行
}
 

A2:
 

复制代码 代码示例:
function sum(n) {
if ( 1 == n) return 1 ;
else return n + arguments.callee(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html页进行执行
} function sum(n) {
if ( 1 == n) return 1 ;
else return n + arguments.callee(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html页进行执行
}
 

A1和A2这两个回答都解决了问题,相信第一种方法是大多数人的常规做法,但是js推荐使用第二种,原书说A1这种方式“其中函数内部包含了对 sum 自身的调用,然而对于JavaScript 来说,函数名仅仅是一个变量名,在函数内部调用sum 即相当于调用一个全局变量,不能很好的体现出是调用自身”,sum都调用sum了,还说“不能很好的体现出是调用自身”,为什么呢?

书上是这么写的:“arguments 对象的另一个属性是callee,它表示对函数对象本身的引用,这有利于实现无名函数的递归或者保证函数的封装性,”这话我承认说的有理,我从来都对书本尤其是技术类的书本保持高度的信任,可是这里说“arguments 对象的另一个属性是callee”,这里“arguments ”怎么成“对象”了?标题都说“传递给函数的隐含参数:arguments ”,难道抄书抄错了?查看电子书,复制粘贴还会有错?呵呵。

您可能感兴趣的文章:
JavaScript arguments 多参传值的自定义函数
js参数可变函数与动态函数
javascript arguments传递给函数的隐含参数
JavaScript 函数参数
javascript arguments解析
javascript中arguments,caller,callee,call,apply用法举例
javaScript arguments 对象的使用实例
javascript函数的apply()和call()方法
javascript 函数调用规则与IF条件判断的用法
JavaScript函数实例教程

[关闭]