从阶乘函数对比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/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!