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 相关文章推荐
一个js封装的不错的选项卡效果代码
Feb 15 Javascript
JS的反射问题
Apr 07 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
May 23 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
Oct 10 Javascript
JS查找字符串中出现最多的字符及个数统计
Feb 04 Javascript
微信小程序tabbar不显示解决办法
Jun 08 Javascript
js实现左右两侧浮动广告
Jul 09 Javascript
浅谈ElementUI中switch回调函数change的参数问题
Aug 24 Javascript
微信小程序开发之左右分栏效果的实例代码
May 20 Javascript
layui table 多行删除(id获取)的方法
Sep 12 Javascript
解决Vue动态加载本地图片问题
Oct 09 Javascript
Vue实现简易计算器
Feb 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
Terran历史背景
2020/03/14 星际争霸
判断是否为指定长度内字符串的php函数
2010/02/16 PHP
一些php技巧与注意事项分析
2011/02/03 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
javascript第一课
2007/02/27 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
D3.js实现散点图和气泡图的方法详解
2016/09/21 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
python基础教程之基本内置数据类型介绍
2014/02/20 Python
python中pygame模块用法实例
2014/10/09 Python
Python标准库之sqlite3使用实例
2014/11/25 Python
Python中的默认参数实例分析
2018/01/29 Python
python常用函数与用法示例
2019/07/02 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
HTML5教程之html 5 本地数据库(Web Sql Database)
2014/04/03 HTML / CSS
应届毕业生求职自荐书
2014/01/03 职场文书
导游实习生自荐书
2014/01/28 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
国际商务专业求职信
2014/07/15 职场文书
刑事附带民事代理词
2015/05/25 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
详细总结Python常见的安全问题
2021/05/21 Python