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 CSS修改学习第五章 给“上传”添加样式
Feb 19 Javascript
js控制表单不能输入空格的小例子
Nov 20 Javascript
使用JavaScript制作一个简单的计数器的方法
Jul 07 Javascript
JavaScript实现搜索框的自动完成功能(一)
Feb 25 Javascript
利用Vue.js实现checkbox的全选反选效果
Jan 18 Javascript
weebox弹出窗口不居中显示的解决方法
Nov 27 Javascript
vue脚手架中配置Sass的方法
Jan 04 Javascript
vue实现动态按钮功能
May 13 Javascript
react实现同页面三级跳转路由布局
Sep 26 Javascript
vue-resource:jsonp请求百度搜索的接口示例
Nov 09 Javascript
一篇超完整的Vue新手入门指导教程
Nov 18 Vue.js
JavaScript继承的三种方法实例
May 12 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
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
深入认识JavaScript中的函数
2007/01/22 Javascript
jQuery boxy弹出层插件中文演示及使用讲解
2011/02/24 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
详解Bootstrap四种图片样式
2016/01/04 Javascript
获取input标签的所有属性的方法
2016/06/28 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
Python3 能振兴 Python的原因分析
2014/11/28 Python
Python字典操作简明总结
2015/04/13 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
Python-split()函数实例用法讲解
2020/12/18 Python
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
工程师岗位职责
2013/11/08 职场文书
幼儿园教师辞职信
2014/01/18 职场文书
给物业的表扬信
2014/01/21 职场文书
2014婚礼司仪主持词
2014/03/14 职场文书