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

作者:纸飞机时间:2026-10-27 05:23:03浏览:399

本文通过阶乘函数示例,深入对比JavaScript与C#在递归实现上的差异。重点解析JavaScript中arguments.callee的作用及其在解除函数名耦合中的价值,并与C#中委托变量的赋值行为进行对照,探讨两种语言在函数对象特性及引用传递机制上的不同表现。

JavaScript与C#阶乘函数实现对比

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(trueFactorial(5)); //120
alert(factorial(5)); //0
</script>

C#代码片段


具体实现如下:

 
protected void Page_Load(object sender, EventArgs e)
{ 
TestFactorial();
} 
public delegate int factorialDelegate(int num); //定义递归函数委托
private void TestFactorial()
{ 
factorialDelegate fdelegate = factorial; //请注意与javascript函数对比
factorialDelegate trueFactorial = fdelegate;
fdelegate = returnZero;
int num1 = trueFactorial(5); //120
int num2 = fdelegate(5); //0
} 
private int returnZero(int num)
{ 
return 0;
} 
private int factorial(int num)
{ 
if (num <= 1)
{ 
return 1;
} 
else
{ 
return num * factorial(num - 1);
} 
} 

通过上述对比,可以得出以下结论:


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高级程序设计》


部分文字源自上述书籍

作者最新文章