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 相关文章推荐
小议Function.apply() 之一------(函数的劫持与对象的复制)
Nov 30 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
Dec 15 Javascript
js实现搜索框关键字智能匹配代码
Mar 26 Javascript
js轮盘抽奖实例分析
Apr 17 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
May 17 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
JavaScript中防止微信浏览器被整体拖动的方法
Aug 25 Javascript
Layui tree 下拉菜单树的实例代码
Sep 21 Javascript
JavaScript设计模式之策略模式实现原理详解
May 29 Javascript
JS实现页面侧边栏效果探究
Jan 08 Javascript
vue 组件基础知识总结
Jan 26 Vue.js
Vue实现动态查询规则生成组件
May 27 Vue.js
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字符串分割函数explode的实例代码
2013/02/07 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
当jQuery1.7遇上focus方法的问题
2014/01/26 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
利用Node.js对文件进行重命名
2017/03/12 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
Django 连接sql server数据库的方法
2018/06/30 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python中import与from方法总结(推荐)
2019/03/21 Python
浅谈tensorflow模型保存为pb的各种姿势
2020/05/25 Python
公司员工的自我评价范例
2013/11/01 职场文书
暑期实践思想汇报
2014/01/06 职场文书
租车协议书范本
2014/04/22 职场文书
心理健康活动总结
2014/04/30 职场文书
表彰大会策划方案
2014/05/13 职场文书
农行心得体会
2014/09/02 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
python的变量和简单数字类型详解
2021/09/15 Python
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python