2014-12-03 60 views
1

我一直在嘗試使用遞歸發現一些使用匿名函數在JavaScript,但我收到以下錯誤的總和:的Javascript匿名函數錯誤

Uncaught SyntaxError: Unexpected token +

我想使用匿名函數這個。任何人都可以幫我找到我在這裏做錯了嗎?

<script type="text/javascript"> 
    console.log(function (n) { 
     if (n == 0) { 
      return 1; 
     } 
     else { 
      return function(n+function(n-1)); 
     } 
    }(8)); 
</script> 

回答

4

有幾個問題,你在做什麼。

對於初學者,試圖遞歸地調用函數(function(n+function(n-1)))將導致調用堆棧大小超過錯誤,因爲您將傳遞給遞歸調用的每個參數的總和加上。你可能想要更接近(n + function(n-1))。

然而,這仍是個問題,因爲你不能遞歸調用一個匿名函數(除非使用arguments.callee的,這是嚴格不允許的模式)。

做它似乎你想要不給一個名稱,你的函數表達式做,你可以這樣做:

console.log(function(n) { 
    if (n == 0) { 
     return 1; 
    } 
    else { 
     return n + arguments.callee(n-1); 
    } 
}(8)) 

但是,你也可以爲你的函數表達式提供一個名稱指的是遞歸調用,這將在嚴格模式下工作,以及:

console.log(function foo(n) { 
    if (n == 0) { 
     return 1; 
    } 
    else { 
     return n + foo(n-1); 
    } 
}(8)) 

編輯:在基本情況(N == 0)你可能想返回0而不是1,如果你的目標是獲得所有整數從0到n的總和。

+0

是否可以在不使用'argument.callee'就像將參數傳遞給自身一樣來完成此操作? – rodrigo 2014-12-03 07:20:21

+0

是的,查看第二個例子,我爲函數表達式提供名稱'foo'。請參閱http://kangax.github.io/nfe/以獲取有關此(命名的函數表達式)與函數聲明之間的區別的詳細信息。 – 2014-12-03 07:23:15

+0

JavaScript中的匿名函數只是指未命名的函數表達式。 – 2014-12-03 07:24:45

3
console.log(function fn(n) { 
     if (n == 0) { 
      return 1; 
     } else { 
      return (n + fn(n - 1)); 
     } 
    }(8)); 

錯誤在此行中的功能(N +功能(N-1)),因爲這是語法錯誤,你不能像你一樣調用函數。在我們的例子中,你應該增加對自調用函數 - 名稱,並用它來遞歸調用堆棧

+0

我是相當新的JavaScript,所以我不知道要弄清楚是否數學函數fn( ){};是匿名或命名的。我也試過返回n +函數(n-1)來試圖保持匿名。我被賦予了一項任務,我需要了解匿名和命名函數。 – rodrigo 2014-12-03 07:18:16

0

當我修改匿名函數以使用正確的遞歸,即return n + f(n-1)時,我發現很奇怪的是,只要腳本駐留在HTML頁面上,下面的代碼就可以工作,而不訴諸arguments.callee。注意:它仍然不能用於console.log。

還有一件事,如果此實例中的代碼試圖獲得從8到1的數字總和,那麼當n等於零時,返回值應該爲零,而不是一個總和在數學上是正確的。

var f = function (n) { 
     if (n == 0) { 
      return 0; 
     } 
     else { 
      return n + f(n-1); 
     } 
}; 

var res = f(8); // 36 

見活生生的例子在http://jsfiddle.net/d5k4ag8w/11/ 此外,這article提供了一種簡單的方法只使用鉛筆和紙:)