從階乘函數(shù)對(duì)比Javascript和C#的異同
更新時(shí)間:2012年05月31日 01:06:36 作者:
今天學(xué)習(xí)Javascript函數(shù),發(fā)現(xiàn)這完全是一個(gè)神奇的東西。跟我們平常所見強(qiáng)類型語言中的函數(shù)有好多不同。下面我們就從C#和JavaScript的兩個(gè)計(jì)算階乘的函數(shù)中比較兩者的異同
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); //定義遞歸函數(shù)委托
private void TestFactorial()
{
factorialDelegate fdelegate = factorial; //請(qǐng)注意與javascript函數(shù)對(duì)比
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中的函數(shù)都不需要設(shè)定函數(shù)是否有返回值,既然如此那么函數(shù)的返回值類型當(dāng)然也就沒有必要設(shè)置了。
2、在javascript中的函數(shù)竟然是一個(gè)對(duì)象,這個(gè)我們接觸的強(qiáng)類型的語言(C、C++、C#)有很大的不同。
3、javascript中有一個(gè)類數(shù)組對(duì)象arguments ,包含著傳入函數(shù)中的所有參數(shù)。而且這個(gè)對(duì)象還有一個(gè)名叫callee的屬性,該屬性是一個(gè)指針,指向擁有這個(gè)arguments對(duì)象的函數(shù)。看一下,C#代碼塊,委托trueFactorial的執(zhí)行和函數(shù)factorial緊緊地耦合在一起。我們沒有辦法消除這種緊密耦合的現(xiàn)象。而在上面javascript代碼塊中,當(dāng)變量trueFactorial獲得了factorial的值。然后,我們又簡(jiǎn)單地將一個(gè)返回0的函數(shù)賦值給了factorial變量。如果像原來那樣不使用arguments.callee,調(diào)用trueFactorial()就會(huì)返回0。在解除了函數(shù)體內(nèi)的代碼與函數(shù)名的耦合狀態(tài)之后,trueFactorial()仍然能夠正常計(jì)算階乘。至于factorial(),他現(xiàn)在只是一個(gè)返回0的函數(shù)。
參考書籍《Javascript高級(jí)程序設(shè)計(jì)》
部分文字來自以上書籍
復(fù)制代碼 代碼如下:
<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#代碼塊
復(fù)制代碼 代碼如下:
protected void Page_Load(object sender, EventArgs e)
{
TestFactorial();
}
public delegate int factorialDelegate(int num); //定義遞歸函數(shù)委托
private void TestFactorial()
{
factorialDelegate fdelegate = factorial; //請(qǐng)注意與javascript函數(shù)對(duì)比
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中的函數(shù)都不需要設(shè)定函數(shù)是否有返回值,既然如此那么函數(shù)的返回值類型當(dāng)然也就沒有必要設(shè)置了。
2、在javascript中的函數(shù)竟然是一個(gè)對(duì)象,這個(gè)我們接觸的強(qiáng)類型的語言(C、C++、C#)有很大的不同。
3、javascript中有一個(gè)類數(shù)組對(duì)象arguments ,包含著傳入函數(shù)中的所有參數(shù)。而且這個(gè)對(duì)象還有一個(gè)名叫callee的屬性,該屬性是一個(gè)指針,指向擁有這個(gè)arguments對(duì)象的函數(shù)。看一下,C#代碼塊,委托trueFactorial的執(zhí)行和函數(shù)factorial緊緊地耦合在一起。我們沒有辦法消除這種緊密耦合的現(xiàn)象。而在上面javascript代碼塊中,當(dāng)變量trueFactorial獲得了factorial的值。然后,我們又簡(jiǎn)單地將一個(gè)返回0的函數(shù)賦值給了factorial變量。如果像原來那樣不使用arguments.callee,調(diào)用trueFactorial()就會(huì)返回0。在解除了函數(shù)體內(nèi)的代碼與函數(shù)名的耦合狀態(tài)之后,trueFactorial()仍然能夠正常計(jì)算階乘。至于factorial(),他現(xiàn)在只是一個(gè)返回0的函數(shù)。
參考書籍《Javascript高級(jí)程序設(shè)計(jì)》
部分文字來自以上書籍
您可能感興趣的文章:
- JavaScript采用遞歸算法計(jì)算階乘實(shí)例
- JavaScript使用遞歸和循環(huán)實(shí)現(xiàn)階乘的實(shí)例代碼
- JavaScript中常用的運(yùn)算符小結(jié)
- Js四則運(yùn)算函數(shù)代碼
- JS取模、取商及取整運(yùn)算方法示例
- JavaScript實(shí)現(xiàn)大數(shù)的運(yùn)算
- JS實(shí)現(xiàn)的加減乘除四則運(yùn)算計(jì)算器示例
- JavaScript中的數(shù)學(xué)運(yùn)算介紹
- 淺談JavaScript中運(yùn)算符的優(yōu)先級(jí)
- Javascript 浮點(diǎn)運(yùn)算精度問題分析與解決
- JS實(shí)現(xiàn)求5的階乘示例
相關(guān)文章
javascript面向?qū)ο笕筇卣髦鄳B(tài)實(shí)例詳解
這篇文章主要介紹了javascript面向?qū)ο笕筇卣髦鄳B(tài),結(jié)合實(shí)例形式詳細(xì)分析了javascript面向?qū)ο蟪绦蛟O(shè)計(jì)中多態(tài)的概念、原理,并結(jié)合實(shí)例形式總結(jié)了多態(tài)的實(shí)現(xiàn)方法與使用技巧,需要的朋友可以參考下2019-07-07
webpack構(gòu)建vue項(xiàng)目的詳細(xì)教程(配置篇)
本篇文章主要介紹了webpack構(gòu)建vue項(xiàng)目的詳細(xì)教程(配置篇),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
js調(diào)用webservice構(gòu)造SOAP進(jìn)行身份驗(yàn)證
這篇文章主要介紹了js調(diào)用webservice構(gòu)造SOAP進(jìn)行身份驗(yàn)證的相關(guān)資料,需要的朋友可以參考下2016-04-04
Typescript tipe freshness 更嚴(yán)格對(duì)象字面量檢查
這篇文章主要為大家介紹了Typescript tipe freshness 更嚴(yán)格對(duì)象字面量檢查,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10

