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 相关文章推荐
jQuery中filter()和find()的区别深入了解
Sep 25 Javascript
jQuery队列操作方法实例
Jun 11 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
Nov 07 Javascript
jQuery操作json常用方法示例
Jan 04 Javascript
Vue键盘事件用法总结
Apr 18 Javascript
JavaScript笛卡尔积超简单实现算法示例
Jul 30 Javascript
vue定义全局变量和全局方法的方法示例
Aug 01 Javascript
对vue事件的延迟执行实例讲解
Aug 28 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
Sep 28 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
Jan 16 Javascript
如何用JavaScript实现一个数组惰性求值库
May 05 Javascript
vue中 this.$set的使用详解
Nov 17 Vue.js
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生成数组再传给js的方法
2014/08/07 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
起点页面传值js,有空研究学习下
2010/01/25 Javascript
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
python中常用的九种预处理方法分享
2016/09/11 Python
详解Python之unittest单元测试代码
2018/01/24 Python
python中的闭包函数
2018/02/09 Python
浅谈Python中的bs4基础
2018/10/21 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
美国玩具公司:U.S.Toy
2018/05/19 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
应用心理学个人的求职信
2013/12/08 职场文书
小学生成长感言
2014/01/30 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
小学生操行评语
2014/04/22 职场文书
2014年端午节演讲稿范文
2014/05/23 职场文书
中层干部考核评语
2015/01/04 职场文书
给男朋友的道歉短信
2015/05/12 职场文书