簡體   English   中英

JavaScript匿名函數錯誤

[英]Javascript anonymous function error

我一直在嘗試使用遞歸在javascript中使用匿名函數查找數字的總和,但出現以下錯誤:

未捕獲到的SyntaxError:意外令牌+

我想為此使用匿名函數。 誰能幫助我在這里找到我做錯了什么?

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

您所做的事情有幾個問題。

對於初學者來說,嘗試遞歸調用函數( 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到n的所有整數的和,則可能要返回0而不是1。

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

此行函數(n + function(n-1))中的錯誤,因為這是語法錯誤,所以您不能像以前那樣調用函數。 在我們的情況下,您應該添加自調用功能-名稱,並將其用於遞歸調用堆棧

當我修改匿名函數以使用正確的遞歸時,即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/的實時示例另外, 本文還提供了一種簡單的方法,僅使用鉛筆和紙就可以算出數學:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM