从阶乘函数对比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 得到文件后缀名的思路及实现
May 09 Javascript
简体中文转换繁体中文(实现代码)
Dec 25 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
Jan 23 Javascript
JavaScript中的toDateString()方法使用详解
Jun 12 Javascript
学习javascript的闭包,原型,和匿名函数之旅
Oct 18 Javascript
js简单时间比较的方法
Aug 02 Javascript
react-native动态切换tab组件的方法
Jul 07 Javascript
如何为你的JS项目添加智能提示与类型检查详解
Mar 12 Javascript
在node中使用jwt签发与验证token的方法
Apr 03 Javascript
微信小程序之左右布局的实现代码
Dec 13 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
Mar 06 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
Jul 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
PHP入门速成教程
2007/03/19 PHP
php array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
PHP错误机制知识汇总
2016/03/24 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
5款Javascript颜色选择器
2009/10/25 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
微信小程序实现运动步数排行功能(可删除)
2018/07/05 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
售后服务科岗位职责范文
2013/11/13 职场文书
入党积极分子思想汇报范文
2014/01/05 职场文书
求职简历自我评价范文
2015/03/10 职场文书
消防安全月活动总结
2015/05/08 职场文书
党小组鉴定意见
2015/06/02 职场文书
商业计划书如何写?关键问题有哪些?
2019/07/11 职场文书
python的变量和简单数字类型详解
2021/09/15 Python
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers