当前位置:编程学习 > JAVA >>

从阶乘函数对比Javascript和C#函数

今天学习Javascript函数,发现这完全是一个神奇的东西。跟我们平常所见强类型语言中的函数有好多不同。下面我们就从C#和JavaScript的两个计算阶乘的函数中比较两者的异同。
     
JavaScript代码块
 
                   

 1     <script type="text/javascript">
 2         function factorial(num) {
 3             if (num <= 1) {
 4                 return 1;
 5             } else {
 6                 return num * arguments.callee(num - 1);
 7             }
 8         }
 9         var  trueFactorial = factorial;
10         factorial = function () {
11             return 0;
12         }
13         alert(trueFactorial(5));    //120
14         alert(factorial(5));        //0
15     </script>
 
                C#代码块
 
 1  protected void Page_Load(object sender, EventArgs e)
 2     {
 3         TestFactorial();
 4     }
 5     public delegate int factorialDelegate(int num);     //定义递归函数委托
 6
 7     private void TestFactorial()
 8     {
 9         factorialDelegate fdelegate = factorial;        //请注意与javascript函数对比
10         factorialDelegate trueFactorial = fdelegate;
11         fdelegate = returnZero;
12         int num1 = trueFactorial(5);                    //120
13         int num2 = fdelegate(5);                        //0
14     }
15
16     private int returnZero(int num)
17     {
18         return 0;
19     }
20
21     private int factorial(int num)
22     {
23         if (num <= 1)
24         {
25             return 1;
26         }
27         else
28         {
29             return num * factorial(num - 1);
30         }
31     }
 
 
  从上面,可以看出:
1、javascript中的函数都不需要设定函数是否有返回值,既然如此那么函数的返回值类型当然也就没有必要设置了。
2、在javascript中的函数竟然是一个对象,这个我们接触的强类型的语言(C、C++、C#)有很大的不同。
3、javascript中有一个类数组对象arguments ,包含着传入函数中的所有参数。而且这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。看一下,C#代码块,委托trueFactorial的执行和函数factorial紧紧地耦合在一起。我们没有办法消除这种紧密耦合的现象。而在上面javascript代码块中,当变量trueFactorial获得了factorial的值。然后,我们又简单地将一个返回0的函数赋值给了factorial变量。如果像原来那样不使用arguments.callee,调用trueFactorial()就会返回0。在解除了函数体内的代码与函数名的耦合状态之后,trueFactorial()仍然能够正常计算阶乘。至于factorial(),他现在只是一个返回0的函数。

 

 

作者 小吉吉

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,