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下查找父节点的简单方法
Aug 13 Javascript
JavaScript效率调优经验
Jun 04 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
Mar 14 Javascript
重构Javascript代码示例(重构前后对比)
Jan 23 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
Jun 05 Javascript
Bootstrap每天必学之折叠
Apr 12 Javascript
老生常谈Javascript中的原型和this指针
Oct 09 Javascript
js对字符串进行编码的方法总结(推荐)
Nov 10 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
Aug 07 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
Sep 17 Javascript
微信小程序左右滚动公告栏效果代码实例
Sep 16 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
Aug 27 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中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
jquery如何根据值设置默认的选中项
2014/03/17 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
基于Javascript倒计时效果
2016/12/22 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
如何根据业务封装自己的功能组件
2019/04/19 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
python数组复制拷贝的实现方法
2015/06/09 Python
python中的错误处理
2016/04/10 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
PyTorch的torch.cat用法
2020/06/28 Python
基于Python实现简单学生管理系统
2020/07/24 Python
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技