从阶乘函数对比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基础框架浅入剖析
Dec 27 Javascript
JavaScript自定义等待wait函数实例分析
Mar 23 Javascript
javascript省市区三级联动下拉框菜单实例演示
Nov 29 Javascript
纯js实现悬浮按钮组件
Dec 17 Javascript
json数据处理及数据绑定
Jan 25 Javascript
利用node.js本地搭建HTTP服务器
Apr 19 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
Jul 24 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
Sep 07 Javascript
如何为vue的项目添加单元测试
Dec 19 Javascript
angular 用Observable实现异步调用的方法
Dec 27 Javascript
layui 实现表单和文件上传一起传到后台的例子
Sep 16 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
Dec 02 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
Window下PHP三种运行方式图文详解
2013/06/11 PHP
php共享内存段示例分享
2014/01/20 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
Jquery性能优化详解
2014/05/15 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
node网页分段渲染详解
2016/09/05 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
python 提取文件的小程序
2009/07/29 Python
Python标准库之Sys模块使用详解
2015/05/23 Python
Python实现的Excel文件读写类
2015/07/30 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
tensorflow获取变量维度信息
2018/03/10 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
实习单位接收函模板
2014/01/10 职场文书
倡议书格式
2014/08/30 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
vue的项目如何打包上线
2022/04/13 Vue.js