从阶乘函数对比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 相关文章推荐
jquery 弹出层实现代码
Oct 30 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
Feb 02 Javascript
js监听键盘事件示例代码
Jul 26 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
Aug 15 Javascript
window.onload与$(document).ready()的区别分析
May 30 Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 Javascript
详解升级react-router 4 踩坑指南
Aug 14 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 Javascript
Vue 拦截器对token过期处理方法
Jan 23 Javascript
JS定义函数的几种常用方法小结
May 23 Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 Javascript
关于ES6尾调用优化的使用
Sep 11 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
解析thinkphp中的导入文件标签
2013/06/20 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
php导出word文档与excel电子表格的简单示例代码
2014/03/08 PHP
PHP中phar包的使用教程
2017/06/14 PHP
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
jQuery中animate的几种用法与注意事项
2016/12/12 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
python中使用enumerate函数遍历元素实例
2014/06/16 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
python实现猜数字游戏
2020/03/25 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
Python3使用xlrd、xlwt处理Excel方法数据
2020/02/28 Python
Python递归函数特点及原理解析
2020/03/04 Python
python实现图片横向和纵向拼接
2020/03/05 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
Farnell德国:电子元器件供应商
2018/07/10 全球购物
高中生学习生活的自我评价
2013/10/09 职场文书
求职简历中个人的自我评价
2013/12/25 职场文书
最热门的自我评价
2013/12/30 职场文书
播音主持专业个人自我评价
2014/01/09 职场文书
幼教求职信
2014/03/12 职场文书
SQL Server中使用表变量和临时表
2022/05/20 SQL Server