从阶乘函数对比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/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/archive/2012/05/31/2527197.html

时间: 2024-08-17 17:23:32

从阶乘函数对比Javascript和C#函数的相关文章

从阶乘函数对比Javascript和C#的异同_javascript技巧

JavaScript代码块 复制代码 代码如下: <script type="text/javascript"> function factorial(num) { if (num <= 1) { return 1; } else { return num * arguments.callee(num - 1); } } var trueFactorial = factorial; factorial = function () { return 0; } alert

谈谈JavaScript中的函数与闭包_基础知识

闭包这东西,说难也难,说不难也不难,下面我就以自己的理解来说一下闭包 一.闭包的解释说明 对于函数式语言来说,函数可以保存内部的数据状态.对于像C#这种编译型命令式语言来说,由于代码总是在代码段中执行,而代码段是只读的,因此函数中的数据只能是静态数据.函数内部的局部变量存放在栈上,在函数执行结束以后,所占用的栈被释放,因此局部变量是不能保存的. Javascript采用词法作用域,函数的执行依赖于变量作用域,这个作用域是在定义函数时确定的.因此Javascript中函数对象不仅保存代码逻辑,还必

AJAX入门之深入理解JavaScript中的函数

ajax|javascript|函数 概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递.在继续讲述之前,先看一下函数的使用语法: function func1(-){-}var func2=function(-){-};var func3=function func4(-){-};var f

JavaScript中parseInt()函数问题

javascript|函数|问题 这个问题大家可能会忽视,我在项目中就遇到了.写了提醒一下大家!!! 在用javascript的parseInt函数时,parseInt("08")或者parseInt("09")返回的居然是0,而parseInt("01")...parseInt("07")都是正确的,一开始很难理解,后来发现出现这个问题的原因是当在前面有"0"时,javascript的debugger会认

用javascript的ShowModalDialog()函数去显示一个aspx页面时缓存的问题

javascript|函数|缓存|问题|显示|页面 用javascript的ShowModalDialog()函数去显示一个aspx页面时,存在缓存的问题,第一次ShowModalDialog的时候看到的是正常的内容,而第二次开始看到的页面内容则都是第一次看的内容,也就是说页面是直接从缓存里面得到的,而不是去服务器取,而我的程序里面都没有让这个页面永远的缓存 两个解决办法: 方法一:先写一个htm页面,里面嵌套一个iframe,iframe的src就是aspx页面,然后ShowModalDial

让JavaScript轻松支持函数重载(Part 2

在"让 JavaScript 轻松支持函数重载 (Part 1 - 设计)"里,我们设计了一套能在JavaScript中描述函数重载的方法,这套方法依赖于一个叫做Overload的静态类,现在我们就来看看如何实现这个静态类. 识别文本签名 我们先来回顾一下上一篇文章中提到的Overload用例: var extend = Overload .add("*, ...", function(target) { }) .add("Boolean, *, ...&

让JavaScript轻松支持函数重载(Part 1

JavaScript支持重载吗? JavaScript支持函数重载吗?可以说不支持,也可以说支持.说不支持,是因为JavaScript不能好像其它原生支持函数重载的语言一样,直接写多个同名函数,让编译器来判断某个调用对应的是哪一个重载.说支持,是因为JavaScript函数对参数列表不作任何限制,可以在函数内部模拟对函数重载的支持. 实际上,在很多著名的开源库当中,我们都可以看到函数内部模拟重载支持的设计.例如说jQuery的jQuery.extend方法,就是通过参数类型判断出可选参数是否存在

JavaScript中small函数

JavaScript中small函数方法是将 HTML 的<SMALL> 标识添加到String 对象中的文本两端.使用方法: strVariable.small( )"String Literal".small( ) 下面的示例演示了 JavaScript中small函数方法是如何使用的: var strVariable = "This is a string";strVariable = strVariable.small( ); 在上一条语句之后

JavaScript中sort函数

JavaScript中sort函数方法是返回一个元素已经进行了排序的 Array 对象. 使用方法: arrayobj.sort(sortfunction) 其中arrayObj是必选项.任意 Array 对象. sortFunction是可选项.是用来确定元素顺序的函数的名称.如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列. JavaScript中sort函数方法将 Array 对象进行适当的排序:在执行过程中并不会创建新的 Array 对象. 如果为 sortfunct