从阶乘函数对比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 Div中加载其他页面的实现代码
Feb 27 Javascript
js内置对象 学习笔记
Aug 01 Javascript
js Function类型
Dec 04 Javascript
JS获取地址栏参数的小例子
Aug 23 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 Javascript
使用JQuery实现的分页插件分享
Nov 05 Javascript
对jQuary选择器的全面总结
Jun 20 Javascript
JavaScript用JSONP跨域请求数据实例详解
Jan 06 Javascript
利用js定义一个导航条菜单
Mar 14 Javascript
浅谈原型对象的常用开发模式
Jul 22 Javascript
vue-resource拦截器设置头信息的实例
Oct 27 Javascript
vue.js的computed,filter,get,set的用法及区别详解
Mar 08 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
详解php的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
php中函数前加&amp;符号的作用分解
2014/07/08 PHP
PHP如何将XML转成数组
2016/04/04 PHP
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
js有关元素内容操作小结
2011/12/20 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
JS中sort函数排序用法实例分析
2016/06/16 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
详解react-refetch的使用小例子
2019/02/15 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
Python打印“菱形”星号代码方法
2018/02/05 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
Python单元测试简单示例
2018/07/03 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
Python文件操作基础流程解析
2020/03/19 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
zooplus波兰:在线宠物店
2019/07/21 全球购物
XML文档面试题
2015/08/05 面试题
恶意软件的定义
2014/11/12 面试题
Linux面试题LINUX系统类
2015/11/25 面试题
社会实践活动总结范文
2014/07/03 职场文书
解约证明模板
2015/06/19 职场文书
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript