• 从阶乘函数对比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的函数。

    参考书籍《Javascript高级程序设计》

    部分文字来自以上书籍


    作者:kissazi2
    出处:http://www.cnblogs.com/kissazi2/
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    使用MFC开发的一个U盘后台拷贝程序
    cpp和c编译区别extern
    VC++的一个类中调用另一个类的变量
    科技创新项目基本知识学习(1) (07年10月2日)
    【原创】斌伯的DirectX学习笔记(2)DirectX的初始化化(10.19 下午)
    【原创】斌伯的DirectX学习笔记——引子
    斌伯的博客园Blog开张大吉
    科技创新项目开始(07年10月2日)
    小哈学Python第二课:Hello Word
    小哈学Python第一课:基本介绍
  • 原文地址:https://www.cnblogs.com/kissazi2/p/2527197.html
Copyright © 2020-2023  润新知