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 高亮显示文本中重要的关键字
Dec 24 Javascript
深入理解Javascript作用域与变量提升
Dec 09 Javascript
JavaScript常用脚本汇总(二)
Mar 04 Javascript
jquery中map函数遍历数组用法实例
May 18 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
Aug 13 Javascript
jQuery简单倒计时效果完整示例
Sep 20 Javascript
微信小程序实战之上拉(分页加载)效果(2)
Apr 17 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
Feb 26 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
Jul 02 Javascript
JavaScript中 ES6变量的结构赋值
Jul 10 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
Dec 05 Javascript
微信小程序代码上传、审核发布小程序
May 18 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 excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
vue+layui实现select动态加载后台数据的例子
2019/09/20 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
Django中对数据查询结果进行排序的方法
2015/07/17 Python
Python装饰器入门学习教程(九步学习)
2016/01/28 Python
Python中的变量和作用域详解
2016/07/13 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
浅谈numpy库的常用基本操作方法
2018/01/09 Python
python实现Zabbix-API监控
2018/09/17 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
小学生教师节演讲稿
2014/09/03 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
应聘教师求职信范文
2015/03/20 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
学前教育见习总结
2015/06/23 职场文书
中秋晚会致辞
2015/07/31 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
python文件名批量重命名脚本实例代码
2021/04/22 Python