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中dom操作和事件的实例学习 下拉框应用
Dec 01 Javascript
Jquery性能优化详解
May 15 Javascript
node.js中的querystring.unescape方法使用说明
Dec 10 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
Jun 11 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
Feb 29 Javascript
jQuery选择器及jquery案例详解(必看)
May 20 Javascript
Javascript获取随机数的实现方法
Jun 22 Javascript
微信js-sdk地理位置接口用法示例
Oct 12 Javascript
Bootstrap企业网站实战项目4
Oct 14 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
Nov 07 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
May 24 Javascript
微信小程序-getUserInfo回调的实例详解
Oct 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
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
2018/03/31 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
wordpress之js库集合研究介绍
2007/08/17 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
一则python3的简单爬虫代码
2014/05/26 Python
python3简单实现微信爬虫
2015/04/09 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
Python元组常见操作示例
2019/02/19 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
CSS3地图动态实例代码(圆圈向外扩散)
2018/06/15 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
Ajxa常见问题都有哪些
2014/03/26 面试题
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
遗失说明具结保证书
2015/02/26 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
家长意见书
2015/06/04 职场文书
贫困生证明范文
2015/06/16 职场文书
小学语文教学随笔
2015/08/14 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
redis数据一致性的实现示例
2022/03/18 Redis
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers