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 相关文章推荐
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
Apr 14 Javascript
JavaScript中的console.dir()函数介绍
Dec 29 Javascript
javascript实现控制浏览器全屏
Mar 30 Javascript
JavaScript中window.open用法实例详解
Apr 15 Javascript
javascript实现查找数组中最大值方法汇总
Feb 13 Javascript
BootStrap中
Dec 10 Javascript
socket.io学习教程之深入学习篇(三)
Apr 29 Javascript
详解Bootstrap 学习(一)入门
Apr 12 Javascript
微信小程序实现侧边栏分类
Oct 21 Javascript
EXTJS7实现点击拖拉选择文本
Dec 17 Javascript
React中使用Vditor自定义图片详解
Dec 25 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
深入php中var_dump方法的使用详解
2013/06/24 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
php微信支付之APP支付方法
2015/03/04 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
python使用matplotlib绘制折线图教程
2017/02/08 Python
django 按时间范围查询数据库实例代码
2018/02/11 Python
python使用thrift教程的方法示例
2019/03/21 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
自动化专业毕业生自荐信
2013/11/01 职场文书
青春寄语大全
2014/04/09 职场文书
学生会竞选演讲稿
2014/04/24 职场文书
亚运会口号
2014/06/20 职场文书
拾金不昧表扬信
2015/01/16 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers