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 相关文章推荐
jqPlot 图表中文API使用文档及源码和在线示例
Feb 07 Javascript
ExtJS4中使用mixins实现多继承示例
Dec 03 Javascript
JavaScript中双叹号!!作用示例介绍
Sep 21 Javascript
AngularJS语法详解(续)
Jan 23 Javascript
jQuery中toggle()函数的使用实例
Apr 17 Javascript
AngularJS递归指令实现Tree View效果示例
Nov 07 Javascript
详解用vue编写弹出框组件
Jul 04 Javascript
浅谈redux以及react-redux简单实现
Aug 28 Javascript
解决layui弹出层layer的area过大被遮挡的问题
Sep 21 Javascript
vue计算属性无法监听到数组内部变化的解决方案
Nov 06 Javascript
微信小程序点击view动态添加样式过程解析
Jan 21 Javascript
在vue中使用echarts(折线图的demo,markline用法)
Jul 20 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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
jquery 实现表单验证功能代码(简洁)
2012/07/03 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
python实现自动重启本程序的方法
2015/07/09 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
瑜伽国际:Yoga International
2018/04/18 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
应届毕业生通用的自荐书范文
2014/02/07 职场文书
人事专员的职责
2014/02/26 职场文书
离婚协议书范文2014
2014/10/16 职场文书
调任通知
2015/04/21 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
诚信高考倡议书
2019/06/24 职场文书
关于vue-router-link选择样式设置
2022/04/30 Vue.js
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers