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 27 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
Jun 21 Javascript
jQuery.holdReady()使用方法
May 20 Javascript
js+css简单实现网页换肤效果
Dec 29 Javascript
深入浅析AngularJS中的module(模块)
Jan 04 Javascript
JavaScript重载函数实例剖析
May 13 Javascript
js实现带农历和八字等信息的日历特效
May 16 Javascript
Markdown+Bootstrap图片自适应属性详解
May 21 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
Oct 25 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
Mar 09 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
Oct 25 Javascript
es6函数中的作用域实例分析
Apr 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添加MySQL数据记录代码
2008/06/07 PHP
PHP 图片上传代码
2011/09/13 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
asp.net和php的区别点总结
2019/10/10 PHP
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
js定时器实例分享
2016/12/20 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
Python和Java进行DES加密和解密的实例
2018/01/09 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
python删除某个目录文件夹的方法
2020/05/26 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
Python调用飞书发送消息的示例
2020/11/10 Python
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
英国电子专家:maplin
2019/09/04 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
vue中data里面的数据相互使用方式
2022/06/05 Vue.js
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers