从阶乘函数对比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 相关文章推荐
javascript css float属性的特殊写法
Nov 13 Javascript
jQuery Animation实现CSS3动画示例介绍
Aug 14 Javascript
js日期对象兼容性的处理方法
Jan 28 Javascript
JavaScript中提前声明变量或函数例子
Nov 12 Javascript
JavaScript日期类型的一些用法介绍
Mar 02 Javascript
JavaScript动态加载样式表的方法
Mar 21 Javascript
JS获取数组最大值、最小值及长度的方法
Nov 24 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
Jul 11 Javascript
vue router 通过路由来实现切换头部标题功能
Apr 24 Javascript
使用typescript构建Vue应用的实现
Aug 26 Javascript
vue组件创建的三种方式小结
Feb 03 Javascript
Vue实现todo应用的示例
Feb 20 Vue.js
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
一个程序下载的管理程序(三)
2006/10/09 PHP
php下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
prototype 源码中文说明之 prototype.js
2006/09/22 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
js array数组对象操作方法汇总
2019/03/18 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
Python装饰器知识点补充
2018/05/28 Python
Django实现分页显示效果
2019/10/31 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
给医务人员表扬信
2014/01/12 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
Android中的Launch Mode详情
2022/06/05 Java/Android