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


Posted in Javascript onMay 31, 2012

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高级程序设计》
部分文字来自以上书籍

Javascript 相关文章推荐
表单提交时自动复制内容到剪贴板的js代码
Mar 16 Javascript
Track Image Loading效果代码分析
Aug 13 Javascript
Javascript倒计时页面跳转实例小结
Sep 11 Javascript
jQuery获取样式中颜色值的方法
Jan 29 Javascript
jQuery实现购物车表单自动结算效果实例
Aug 10 Javascript
JS创建事件的三种方法(实例代码)
May 12 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
Sep 26 Javascript
jQuery插件echarts去掉垂直网格线用法示例
Mar 03 Javascript
jquery实现下拉菜单的手风琴效果
Jul 23 jQuery
Angularjs的$http异步删除数据详解及实例
Jul 27 Javascript
vue的基本用法与常见指令
Aug 15 Javascript
openlayers 3实现车辆轨迹回放
Sep 24 Javascript
javascript 快速排序函数代码
May 30 #Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
May 30 #Javascript
Chosen 基于jquery的选择框插件使用方法
May 30 #Javascript
基于jquery的鼠标拖动效果代码
May 30 #Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
May 30 #Javascript
基于jQuery的倒计时实现代码
May 30 #Javascript
基于jquery的放大镜效果
May 30 #Javascript
You might like
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
Javascript点击按钮随机改变数字与其颜色
2016/09/01 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
小程序实现多列选择器
2019/02/15 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
Python常用的日期时间处理方法示例
2015/02/08 Python
Python中的with...as用法介绍
2015/05/28 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
基于python图像处理API的使用示例
2020/04/03 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
网络安全方面的面试题
2016/01/07 面试题
广州某公司软件工程师面试题
2014/12/22 面试题
餐饮管理自我介绍信
2014/01/15 职场文书
个人典型事迹材料
2014/12/30 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis