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 相关文章推荐
Javascript的IE和Firefox兼容性汇编
Jul 01 Javascript
快速解决jQuery与其他库冲突的方法介绍
Jan 02 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
Nov 08 Javascript
js给selected添加options的方法
May 06 Javascript
一系列Bootstrap导航条使用方法分享
Apr 29 Javascript
实例解析jQuery中proxy()函数的用法
May 24 Javascript
vue.js中过滤器的使用教程
Jun 08 Javascript
javascript观察者模式实现自动刷新效果
Sep 05 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
Sep 14 Javascript
解决js ajax同步请求造成浏览器假死的问题
Jan 18 Javascript
微信小程序动态添加view组件的实例代码
May 23 Javascript
关于React Native使用axios进行网络请求的方法
Aug 02 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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
jquery实现手风琴效果
2015/11/20 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
vue2 前端搜索实现示例
2018/02/26 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
Python使用py2exe打包程序介绍
2014/11/20 Python
Python中AND、OR的一个使用小技巧
2015/02/18 Python
浅析Python中signal包的使用
2015/11/13 Python
Python正则表达式教程之二:捕获篇
2017/03/02 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
Django缓存Cache使用详解
2020/11/30 Python
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
介绍一下Ruby的多线程处理
2013/02/01 面试题
校企合作协议书
2014/04/16 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
公司收款委托书范本
2014/09/20 职场文书
大连星海广场导游词
2015/02/10 职场文书
辞职信怎么写
2015/02/27 职场文书
办公室禁烟通知
2015/04/23 职场文书
2015年法院工作总结范文
2015/04/28 职场文书