2014-12-03 127 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提供了一种简单的方法只使用铅笔和纸:)