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之水平横向滚动歌词同步的应用
May 07 Javascript
JS 面向对象的5钟写法
Jul 31 Javascript
javascript模拟的Ping效果代码 (Web Ping)
Mar 13 Javascript
JS中怎样判断undefined(比较不错的方法)
Mar 27 Javascript
简单学习JavaScript中的for语句循环结构
Nov 10 Javascript
JavaScript中关于iframe滚动条的去除和保留
Nov 17 Javascript
基于JavaScript实现活动倒计时效果
Apr 20 Javascript
关于react-router的几种配置方式详解
Jul 24 Javascript
layer弹出子iframe层父子页面传值的实现方法
Nov 22 Javascript
微信小程序之数据绑定原理解析
Aug 14 Javascript
webpack+express实现文件精确缓存的示例代码
Jun 11 Javascript
HTML+JS实现在线朗读器
Feb 15 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中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
php中使用array_filter()函数过滤空数组的实现代码
2014/08/19 PHP
33道php常见面试题及答案
2015/07/06 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
在python win系统下 打开TXT文件的实例
2018/04/29 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
python 如何对logging日志封装
2020/12/02 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
自考毕业生自我鉴定
2013/11/04 职场文书
肯尼迪就职演说稿
2013/12/31 职场文书
办理护照介绍信
2014/01/16 职场文书
户外活动总结范文
2014/04/30 职场文书
社区重阳节活动总结
2015/03/24 职场文书
微信搭讪开场白
2015/05/28 职场文书
亮剑观后感300字
2015/06/05 职场文书
植物园观后感
2015/06/11 职场文书
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android