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 相关文章推荐
javascript 解析后的xml对象的读取方法细解
Jul 25 Javascript
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
Oct 22 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
May 23 Javascript
在JS中解析HTML字符串示例代码
Apr 16 Javascript
js中this用法实例详解
May 05 Javascript
JavaScript取得WEB安全颜色列表的方法
Jul 14 Javascript
javascript实现数字倒计时特效
Mar 30 Javascript
Bootstrap选项卡与Masonry插件的完美结合
Jul 06 Javascript
JS实现的几个常用算法
Nov 12 Javascript
微信小程序实现实时圆形进度条的方法示例
Feb 24 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
Dec 14 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
Aug 03 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
杏林同学录(三)
2006/10/09 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
PHP之header函数详解
2021/03/02 PHP
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
JQuery live函数
2010/12/24 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
js实现无缝滚动图
2017/02/22 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
Linux下Python获取IP地址的代码
2014/11/30 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python 多核并行计算的示例代码
2017/11/07 Python
Python日志模块logging基本用法分析
2018/08/23 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
详解python程序中的多任务
2020/09/16 Python
CSS3 :not()选择器实现最后一行li去除某种css样式
2016/10/19 HTML / CSS
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
尽职尽责村干部自我鉴定
2014/01/23 职场文书
安全生产活动月方案
2014/03/09 职场文书
春节联欢会主持词
2014/03/24 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS