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与js函数冲突的两种解决方法
Sep 09 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
Sep 01 Javascript
javascript动态生成树形菜单的方法
Nov 14 Javascript
百度搜索框智能提示案例jsonp
Nov 28 Javascript
node操作mysql数据库实例详解
Mar 17 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
Apr 13 Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 Javascript
Javascript(es2016) import和require用法和区别详解
Aug 11 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
Sep 28 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
Dec 29 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
Sep 11 Javascript
jquery实现图片放大镜效果
Dec 23 jQuery
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编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
php实现rc4加密算法代码
2012/04/25 PHP
php中长文章分页显示实现代码
2012/09/29 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
javascript void(0)的妙用
2009/10/21 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
package.json各个属性说明详解
2020/03/11 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
Python实现图像的垂直投影示例
2020/01/17 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
详解Django配置JWT认证方式
2020/05/09 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
python 如何引入协程和原理分析
2020/11/30 Python
利用python爬取有道词典的方法
2020/12/08 Python
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
爱心助学感谢信
2015/01/21 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
丧事主持词
2015/07/02 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
导游词之日月潭
2019/11/05 职场文书