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

 更新时间:2012年05月31日 01:06:36   作者:  
今天学习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(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高级程序设计
部分文字来自以上书籍

相关文章

  • Rxjs 中处理错误和抓取错误的代码案例

    Rxjs 中处理错误和抓取错误的代码案例

    这篇文章主要介绍了Rxjs 中怎么处理和抓取错误,本文,我们学习了如何使用 catchError 在数据流中抓取错误,怎么去修改和返回 observable,或者使用 EMPTY 不去触发组件中的错误,需要的朋友可以参考下
    2022-08-08
  • 基于casperjs和resemble.js实现一个像素对比服务详解

    基于casperjs和resemble.js实现一个像素对比服务详解

    这篇文章主要给大家介绍了关于基于casperjs和resemble.js实现一个像素对比服务的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • JavaScript通过nodejs进行后端开发的过程

    JavaScript通过nodejs进行后端开发的过程

    本文系统介绍了Node.js后端开发流程,涵盖环境搭建、HTTP服务器创建(http/Express)、路由中间件、数据库集成(MongoDB/MySQL)、JWT认证、文件上传、错误处理及部署(PM2/Docker),并提供项目结构建议,助你快速构建应用,感兴趣的朋友一起看看吧
    2025-06-06
  • Ajax基础知识详解

    Ajax基础知识详解

    本文主要介绍了Ajax基础知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • js无刷新操作table的行和列

    js无刷新操作table的行和列

    这篇文章主要介绍了js操作table的行和列,无刷新实现,需要的朋友可以参考下
    2014-03-03
  • JavaScript 读取及写入本地文件的操作方法

    JavaScript 读取及写入本地文件的操作方法

    文章介绍了在纯前端JavaScript中如何读取和写入本地文件,浏览器环境限制了直接访问文件系统,但提供了文件上传和下载功能,对于文件读取,可以使用FileReader API,支持分片读取和流式处理,感兴趣的朋友一起看看吧
    2025-03-03
  • 微信小程序 数据封装,参数传值等经验分享

    微信小程序 数据封装,参数传值等经验分享

    这篇文章主要介绍了微信小程序 数据封装,参数传值等经验分享的相关资料,需要的朋友可以参考下
    2017-01-01
  • 非常漂亮的JS+CSS图片幻灯切换特效

    非常漂亮的JS+CSS图片幻灯切换特效

    放在你的首页比较不错,宽屏图片格式,每张图片平滑飞入切换,鼠标放上自动切换,和FLASH的平滑效果差不多,喜欢的朋友可以收藏下
    2013-11-11
  • js下弹出窗口的变通

    js下弹出窗口的变通

    js下弹出窗口的变通...
    2007-04-04
  • 解读ES6中class关键字

    解读ES6中class关键字

    这篇文章主要介绍了ES6中class关键字,class是es6引入的最重要特性之一。本文通过实例代码给大家详解,需要的朋友可以参考下
    2017-11-11

最新评论