Javascript函数中的参数

  关于JS中的函数,相信大家已经很了解了,其中有些特性呢,感觉还是值得提一提的,下面就说说JS中的函数吧。

  首先,在JS中函数也是一种标识符,可以将它赋值给新的变量,也可以通过这个变量来调用。这有点像C语言的函数指针,不过也不完全一样,如下面的代码:

 

1  function  myfun() {
2      alert( " funcation call " );
3  }
4 
5  var  fun  =  myfun;            
6 
7  fun();
8 

 

  再有一个值得说一下的,就是JS中的函数的参数不一定是严格匹配的,通常的编程经验,比如有这样一个函数 fun(aa,bb),那么我们在调用这个函数的时候就应该给他传递两个参数。但是在JS中,我们可以给他传递任意个参数,1个,3个,等等,都可以。JS中的参数传递,不完全是按照函数声明时指定的那些参数,在每次调用函数的时候,都会有一个命名为arguments的数组,这个数组里面存储了函数调用时,传递进来的所有参数,有了它,我们甚至可以不再函数声明时指定形式参数,如下代码:

 

 1  function  args() {
 2       if  (arguments[ 0 !=  undefined) {
 3 
 4          alert(arguments[ 0 ]);
 5      }
 6  }
 7 
 8  args();          // 什么也不输出
 9  args( " hehe " );    // 弹出参数值
10 

 

 

  如上所示,arguments数组的每个下标,从0开始一次对应着传递进来的每个参数,如果指定位置没有参数,那么他就会是undefined,

我们可以使用arguments.length来判断传递进来的参数个数,这种方式有时候会很有用,比如,我们可以利用这个特性来模拟C语言的printf函数:

 

 1  function  format() {
 2       if  (arguments.length  ==   0 ) {
 3           return   "" ;
 4      }
 5       var  formatter  =  arguments[ 0 ];
 6 
 7       for  ( var  i  =   1 ; i  <  arguments.length; i ++ ) {
 8 
 9          formatter  =  formatter.replace( new  RegExp( " \\{ " + (i - 1 ) + " \\} " , " gm " ), arguments[i]);
10      }
11 
12       return  formatter;        
13  }
14 
15  alert(format( " Hello {0},this is the fetures of {1}! " , " world " , " javascript " ));

 

   上面的代码,简单实现了格式化输出的基本功能,当然,有兴趣的话,还可以把它做得更好 ,最后再说一个吧,arguments还有个callee属性,它代表了当前被调的函数,这个属性值某些情况下还是有点用处的。考虑如下代码:

   

 1  function  sum(num) {
 2                  
 3       if  (num  ==   1 ) {
 4           return  num;
 5      }  else  {
 6           return  num  +  sum(num  -   1 );
 7      }
 8      
 9  }
10 
11  var  mysum  =  sum;
12 
13  alert(mysum( 5 ));     // 输出 15
14 
15  sum  =   function () {  return   1 ; };
16 
17  alert(mysum( 5 ));     // 输出 6

 

   这是一个递归求和的函数,mysum一开始和sum是同样的函数,如果在程序执行过程中sum函数体被改变了,再调用mysum的结果就会不同,如果将函数改成这样,就不会出现这样的问题啦~

 

 1  function  sum(num) {
 2                  
 3       if  (num  ==   1 ) {
 4           return  num;
 5      }  else  {
 6           return  num  +  arguments.callee(num  -   1 );
 7      }
 8      
 9  }
10 
11  var  mysum  =  sum;
12 
13  alert(mysum( 5 ));     // 输出 15
14 
15  sum  =   function () {  return   1 ; };
16 
17  alert(mysum( 5 ));     // 输出 15

 

 

  如上面这样,不管外面的引用怎么改变callee都会指向当前的被调函数,在用JS写递归的时候,这点还是有必要注意一下的,虽然一般不

会出现这种错误,但是如果出了是不太容易发现原因的,会浪费不少时间。

  就先说这么多吧,博客文章尽量短小一些,以免占用大家过多时间,一些不足之处还望大家指正。 

转载于:https://www.cnblogs.com/springfield/archive/2010/03/26/1696923.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值