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


Posted in Javascript onAugust 21, 2009

本人第一次看到这个东东的时候,以为就是“变相”的普通参数,只不过不用在定义函数的时候明确声明而已。
不过,代码是廉价的(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 相关文章推荐
js css样式操作代码(批量操作)
Oct 09 Javascript
JS中的this变量的使用介绍
Oct 21 Javascript
下拉列表select 由左边框移动到右边示例
Dec 04 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
Mar 20 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
Jan 21 Javascript
基于javascript实现九宫格大转盘效果
May 28 Javascript
解决jQuery使用append添加的元素事件无效的问题
Aug 30 jQuery
VUE 实现滚动监听 导航栏置顶的方法
Sep 11 Javascript
Vue中插入HTML代码的方法
Sep 21 Javascript
微信小程序云开发(数据库)详解
May 17 Javascript
小程序如何支持使用 async/await详解
Sep 12 Javascript
原生js实现移动小球(碰撞检测)
Dec 17 Javascript
javascript 自定义事件初探
Aug 21 #Javascript
IE 下的只读 innerHTML
Aug 21 #Javascript
JS 控制CSS样式表
Aug 20 #Javascript
JS获取父节点方法
Aug 20 #Javascript
javascript 数组排序函数
Aug 20 #Javascript
用Javascript数组处理多个字符串的连接问题
Aug 20 #Javascript
JQUERY 浏览器判断实现函数
Aug 20 #Javascript
You might like
PHP删除HTMl标签的实现代码
2013/06/30 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
网页自动跳转代码收集
2009/09/27 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
Tensorflow卷积神经网络实例
2018/05/24 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
python文件排序的方法总结
2020/09/13 Python
Python 串口通信的实现
2020/09/29 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
一款纯css3实现的非常实用的鼠标悬停特效演示
2014/11/05 HTML / CSS
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
会计自我鉴定
2013/11/02 职场文书
毕业典礼演讲稿
2014/05/13 职场文书
商铺消防安全责任书
2014/07/29 职场文书
公积金接收函格式
2015/01/30 职场文书
护士个人年度总结范文
2015/02/13 职场文书
感恩教育主题班会
2015/08/12 职场文书
学生病假条范文
2015/08/17 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫
python解析照片拍摄时间进行图片整理
2022/07/23 Python
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers