从阶乘函数对比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的函数。
作者 小吉吉
补充:综合编程 , 其他综合 ,