先讓我熱熱身,寫一個遞歸的函數是來計算n的階乘.不出意外,它應該是這個樣子:
function factorial (n) { if (n == 1) { return 1; } else { return n * factorial(n - 1); } }
這也太簡單了吧,我要增長一點難度,只准使用匿名函數. 哼哼,so easy.
function (n) { if (n == 1) { return 1; } else { return n * this(n - 1); } }
而後我就想,若是不使用 this 關鍵字,有沒辦法呢?我眉頭一皺
但俗話說的好,再狡猾的獵人也鬥不過一隻好狐狸啊!我略一思索,不肖片刻便行雲流水般寫下以下代碼:
(function(n,factorial) { //求n的階乘 n = 5 if (n == 1) { return 1; } else { return n * factorial(n - 1, factorial); } })(5,function(n,factorial) { if (n == 1) { return 1; } else { return n * factorial(n - 1, factorial); } })
站在公司新發的工程學座椅上,品一口82年的java
隨後志得意滿的對旁邊工位的jack說,"jack,你看我這一手js代碼寫 得如何啊?" jack連眼皮都沒擡一下,只輕輕說了句"這麼醜的代碼也好意思拿出來 給別 人看?",而後就繼續睡覺了. 我剛想反駁,卻忽然以爲這傢伙說的好有道理啊(⊙o⊙)! 在敲壞37個回車鍵以後,我終於寫出了以下代碼
(function(n,factorial) { //求n的階乘 n = 5 return factorial(n, factorial); })(5,function(n,factorial) { if (n == 1) { return 1; } else { return n * factorial(n - 1, factorial); } })
又報廢了兩個回車鍵
(function (n) { return (function(n,factorial) { return factorial(n,factorial); })(n ,function(n,factorial) { if (n == 1) { return 1; } else { return n * factorial(n - 1, factorial); } }) })(5)
這時恰逢cto路過!
因而
(function (requireRecFun) {//將須要遞歸的函數傳進去便可. return function (n){return requireRecFun(n,requireRecFun)}; })(function(n,factorial) { if (n == 1) { return 1; } else { return n * factorial(n - 1,factorial); } })(5)