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 left,right,mid函数
Jun 10 Javascript
JavaScript中的字符串操作详解
Nov 12 Javascript
jQuery控制cookie过期时间的方法
Apr 07 Javascript
JS+CSS实现的蓝色table选项卡效果
Oct 08 Javascript
自己动手写的javascript前端等待控件
Oct 30 Javascript
每天一篇javascript学习小结(Function对象)
Nov 16 Javascript
vue axios用法教程详解
Jul 23 Javascript
vue: WebStorm设置快速编译运行的方法
Oct 18 Javascript
基于Vue-cli快速搭建项目的完整步骤
Nov 03 Javascript
JavaScript动态添加数据到表单并提交的几种方式
Jun 26 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
Feb 09 Javascript
纯js+css实现在线时钟
Aug 18 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 短链接算法收集与分析
2011/12/30 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
AngularJS压缩JS技巧分析
2016/11/08 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
微信小程序8种数据通信的方式小结
2020/02/03 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
Python 列表list使用介绍
2014/11/30 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
Tesserocr库的正确安装方式
2018/10/19 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
struct和class的区别
2015/11/20 面试题
启动一个线程是用run()还是start()
2016/12/25 面试题
护士自我鉴定总结
2014/03/24 职场文书
民族学专业求职信
2014/07/28 职场文书
领导班子整改措施
2014/10/24 职场文书
2014年团委工作总结
2014/11/13 职场文书
网络营销计划
2015/01/17 职场文书
家长高考寄语
2015/02/27 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
学校运动会加油词
2015/07/18 职场文书
教师廉政准则心得体会
2016/01/20 职场文书