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计数器代码
Nov 04 Javascript
jquery实现心算练习代码
Dec 06 Javascript
js兼容的placeholder属性详解
Aug 18 Javascript
js匿名函数的调用示例(形式多种多样)
Aug 20 Javascript
jquery获取当前日期的方法
Jan 14 Javascript
跟我学习javascript的this关键字
May 28 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
May 16 Javascript
使用JavaScript获取Request中参数的值方法
Sep 27 Javascript
jQuery实现的简单前端搜索功能示例
Oct 28 jQuery
结合mint-ui移动端下拉加载实践方法总结
Nov 08 Javascript
全新打包工具parcel零配置vue开发脚手架
Jan 11 Javascript
VUE简单的定时器实时刷新的实现方法
Jan 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
文件上传的实现
2006/10/09 PHP
php中常用字符串处理代码片段整理
2011/11/07 PHP
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
javascript加号&quot;+&quot;的二义性说明
2013/03/04 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
js倒计时简单实现方法
2015/12/17 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
2020/06/01 Javascript
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
python将unicode转为str的方法
2017/06/21 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
师范生个人推荐信
2013/11/29 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
检举信的格式及范文
2014/04/04 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android