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 相关文章推荐
让getElementsByName适应IE和firefox的方法
Sep 24 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
Sep 17 Javascript
Js base64 加密解密介绍
Oct 11 Javascript
jquery实现图片翻页效果
Dec 23 Javascript
查找Oracle高消耗语句的方法
Mar 22 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
Oct 29 Javascript
浅谈在js传递参数中含加号(+)的处理方式
Oct 11 Javascript
Canvas实现动态的雪花效果
Feb 13 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
May 27 jQuery
JavaScript 作用域scope简单汇总
Oct 23 Javascript
Vue实现剪切板图片压缩功能
Feb 04 Javascript
jQuery实现购物车全功能
Jan 11 jQuery
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新手上路(四)
2006/10/09 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
关于php循环跳出的问题
2013/07/01 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
学习面向对象之面向对象的术语
2010/11/30 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
js控制input输入字符解析
2013/12/27 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
简述JS控制台的使用
2018/07/15 Javascript
[33:17]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
pandas修改DataFrame列名的方法
2018/04/08 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
python skimage 连通性区域检测方法
2018/06/21 Python
python实现门限回归方式
2020/02/29 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
函授毕业生的自我鉴定
2013/11/26 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
银行竞聘报告范文
2014/11/06 职场文书
办公室个人总结
2015/02/28 职场文书
在职证明范本
2015/06/15 职场文书
护理培训心得体会
2016/01/22 职场文书