第一笔,第二笔没有 - >为什么?

时间:2009-06-26 18:50:10

标签: javascript

<!-- first -->
<script>
var total = 0;
var newAccumulator = function()
{
  return function(i) { total += i; };
}

var foldl = function(arr, putNum)
{
  for (var i = 0; i < arr.length; ++i)
  {
    putNum(arr[i]);
  }
}

foldl([1, 2, 3, 4], newAccumulator());
document.write("Sum: " + total + "<br/>");
</script>

<!-- second -->
<script>
var total = 0;
var newAccumulator = function(i)
{
  total += i;
}

var foldl = function(arr, putNum)
{
  for (var i = 0; i < arr.length; ++i)
  {
    putNum(arr[i]);
  }
}

foldl([1, 2, 3, 4], newAccumulator());
document.write("Sum: " + total + "<br/>");
</script>

4 个答案:

答案 0 :(得分:3)

它认为你想要

 foldl([1, 2, 3, 4], newAccumulator);

在第二个电话中

答案 1 :(得分:2)

您正在fold1函数中执行newAccumulator。传入newAccumulator而不是newAccumulator();

foldl([1, 2, 3, 4], newAccumulator());

foldl([1, 2, 3, 4], newAccumulator);

答案 2 :(得分:2)

在致电foldl时,您拨打newAccumulator功能:

foldl([1, 2, 3, 4], newAccumulator());

在第一种情况下,它返回一个执行求和的函数:

return function(i) { total += i; };

在第二种情况下,对newAccumulator的调用不会返回任何内容,因此foldl没有可以调用来计算总和的函数。
你应该将newAccummulator直接传递给foldl,而不是它(不会)返回的值:

foldl([1, 2, 3, 4], newAccumulator);

答案 3 :(得分:1)

第二个不起作用,因为你没有传递foldl函数。

在第一个示例中,执行newAccumulator,newAccumulator返回一个函数,该函数传递给foldl ... Foldl使用该函数对数字求和。

在第二个示例中,执行newAccumulator并传递结果,但newAccumulator的结果不是函数。

此外,您命名为foldl的函数通常称为“foreach”。如果将结果存储在数组中,则可能将其称为“map”。 Foldl通常会通过将一个函数添加到总数并返回新的总数来累积总数。