Javascript 函数中的参数使用分析


Posted in Javascript onMarch 27, 2010

首先,在JS中函数也是一种标识符,可以将它赋值给新的变量,也可以通过这个变量来调用。这有点像C语言的函数指针,不过也不完全一样,如下面的代码:

function myfun() { 
alert("funcation call"); 
} 
var fun = myfun; 
fun();

再有一个值得说一下的,就是JS中的函数的参数不一定是严格匹配的,通常的编程经验,比如有这样一个函数 fun(aa,bb),那么我们在调用这个函数的时候就应该给他传递两个参数。但是在JS中,我们可以给他传递任意个参数,1个,3个,等等,都可以。JS中的参数传递,不完全是按照函数声明时指定的那些参数,在每次调用函数的时候,都会有一个命名为arguments的数组,这个数组里面存储了函数调用时,传递进来的所有参数,有了它,我们甚至可以不再函数声明时指定形式参数,如下代码:

function args() { 
if (arguments[0] != undefined) { 
alert(arguments[0]); 
} 
} 
args(); //什么也不输出 
args("hehe"); //弹出参数值

如上所示,arguments数组的每个下标,从0开始一次对应着传递进来的每个参数,如果指定位置没有参数,那么他就会是undefined,
我们可以使用arguments.length来判断传递进来的参数个数,这种方式有时候会很有用,比如,我们可以利用这个特性来模拟C语言的printf函数:

function format() { 
if (arguments.length == 0) { 
return ""; 
} 
var formatter = arguments[0]; 
for (var i = 1; i < arguments.length; i++) { 
formatter = formatter.replace(new RegExp("\\{"+(i-1)+"\\}","gm"), arguments[i]); 
} 
return formatter; 
} 
alert(format("Hello {0},this is the fetures of {1}!","world","javascript"));

上面的代码,简单实现了格式化输出的基本功能,当然,有兴趣的话,还可以把它做得更好 ,最后再说一个吧,arguments还有个callee属性,它代表了当前被调的函数,这个属性值某些情况下还是有点用处的。考虑如下代码:

function sum(num) { 
if (num == 1) { 
return num; 
} else { 
return num + sum(num - 1); 
} 
} 
var mysum = sum; 
alert(mysum(5)); //输出 15 
sum = function() { return 1; }; 
alert(mysum(5)); //输出 6

这是一个递归求和的函数,mysum一开始和sum是同样的函数,如果在程序执行过程中sum函数体被改变了,再调用mysum的结果就会不同,如果将函数改成这样,就不会出现这样的问题啦~

function sum(num) { 
if (num == 1) { 
return num; 
} else { 
return num + arguments.callee(num - 1); 
} 
} 
var mysum = sum; 
alert(mysum(5)); //输出 15 
sum = function() { return 1; }; 
alert(mysum(5)); //输出 15

如上面这样,不管外面的引用怎么改变callee都会指向当前的被调函数,在用JS写递归的时候,这点还是有必要注意一下的,虽然一般不
会出现这种错误,但是如果出了是不太容易发现原因的,会浪费不少时间。

Javascript 相关文章推荐
完美解决JS中汉字显示乱码问题(已解决)
Dec 27 Javascript
扩展jQuery 键盘事件的几个基本方法
Oct 30 Javascript
js onload事件不起作用示例分析
Oct 09 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
Dec 20 Javascript
javascript 自定义回调函数示例代码
Sep 26 Javascript
jquery带下拉菜单和焦点图代码分享
Aug 24 Javascript
Angular2学习笔记——详解路由器模型(Router)
Dec 02 Javascript
微信小程序 UI与容器组件总结
Feb 21 Javascript
详解vuejs之v-for列表渲染
Jun 22 Javascript
一种angular的方法级的缓存注解(装饰器)
Mar 13 Javascript
JS的函数调用栈stack size的计算方法
Jun 24 Javascript
Vue cli构建及项目打包以及出现的问题解决
Aug 27 Javascript
js几个验证函数代码
Mar 25 #Javascript
Firefox下提示illegal character并出现乱码的原因
Mar 25 #Javascript
JavaScript setTimeout和setInterval的使用方法 说明
Mar 25 #Javascript
JavaScript 学习初步 入门教程
Mar 25 #Javascript
ext 列表页面关于多行查询的办法
Mar 25 #Javascript
JS学习之一个简易的日历控件
Mar 24 #Javascript
javascript instanceof,typeof的区别
Mar 24 #Javascript
You might like
SONY SRF-40W电路分析
2021/03/02 无线电
用PHP发电子邮件
2006/10/09 PHP
PHP基础知识介绍
2013/09/17 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
Angular整合zTree的示例代码
2018/01/24 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python遍历序列enumerate函数浅析
2017/10/17 Python
python删除服务器文件代码示例
2018/02/09 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
python的sorted用法详解
2019/06/25 Python
Python跳出多重循环的方法示例
2019/07/03 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
python实现扫雷小游戏
2020/04/24 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
Keras搭建自编码器操作
2020/07/03 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
财务会计专业应届毕业生求职信
2013/10/18 职场文书
奥林匹克的口号
2014/06/13 职场文书
大班上学期个人总结
2015/02/13 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python