javascript:传递给函数的隐含参数:arguments
2009-08-20 11:20
393 查看
众所周知,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”?看到这里相信你对上面的疑问已经消除。
到这里你以为你掌握了arguments的全部?那就太小瞧js的天才设计者(们)了,下面看另外一个有才的设计:
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 ”,难道抄书抄错了?查看电子书,靠,复制粘贴还会有错?
对象,对象?对象何其多,下篇找"对象"。
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”?看到这里相信你对上面的疑问已经消除。
到这里你以为你掌握了arguments的全部?那就太小瞧js的天才设计者(们)了,下面看另外一个有才的设计:
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
- javascript:传递给函数的隐含参数:arguments
- 传递给函数的隐含参数:arguments及递归函数的实现
- js中每个函数中隐含的arguments对象,用语表示调用时实际传递的参数
- JavaScript中函数参数的值传递和引用传递
- JavaScript用函数传递的几种参数
- 【JavaScript】函数中的arguments对象与Rest参数
- javascript arguments 传递给函数的隐含参数
- [Effective JavaScript 笔记]第22条:使用arguments创建可变参数的函数
- JavaScript中函数参数的值传递和引用传递
- 【学习-水滴石穿】 JavaScript用arguments对象访问函数的参数
- JavaScript中函数参数的值传递和引用传递
- javascript中函数参数的按值传递
- 【JavaScript学习笔记】5:有关函数,typeof,参数过多/不足,arguments,rest
- javascript得到网址中传递的参数 的处理函数
- javascript写的关于静态页面获取URL传递参数的函数[原创]
- javascript自定义函数传递参数的常见问题
- JavaScript 函数参数传递到底是值传递还是引用传递 (精华)
- javascript基础:函数传递参数的方式、参数数组、变量范围(变量作用域)
- JavaScript中函数参数的值传递和引用传递