從階乘函數(shù)對(duì)比Javascript和C#的異同
更新時(shí)間:2012年05月31日 01:06:36 作者:
今天學(xué)習(xí)Javascript函數(shù),發(fā)現(xiàn)這完全是一個(gè)神奇的東西。跟我們平常所見強(qiáng)類型語(yǔ)言中的函數(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)類型的語(yǔ)言(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)類型的語(yǔ)言(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)文章
使用layui的router來進(jìn)行傳參的實(shí)現(xiàn)方法
今天小編就為大家分享一篇使用layui的router來進(jìn)行傳參的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09get post jsonp三種數(shù)據(jù)交互形式實(shí)例詳解
本文通過實(shí)例給大家詳細(xì)介紹了get post jsonp三種數(shù)據(jù)交互形式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-08-08js實(shí)現(xiàn)form自動(dòng)完成功能
2008-02-02理清apply(),call()的區(qū)別和關(guān)系
如果沒接觸過動(dòng)態(tài)語(yǔ)言,以編譯型語(yǔ)言的思維方式去理解javaScript將會(huì)有種神奇而怪異的感覺,因?yàn)橐庾R(shí)上往往不可能的事偏偏就發(fā)生了,甚至覺得不可理喻.2011-08-08