繁体   English   中英

首先总结,第二不->为什么?

[英]First sums, second doesn't -> why?

<!-- 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>

它认为你想要

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

在第二次通话中

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

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

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

在对foldl的调用中,调用newAccumulator函数:

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

在第一种情况下,这将返回一个求和的函数:

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

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

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

第二个无效,因为您没有传递foldl函数。

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

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

同样,您将其命名为foldl的函数通常称为“ foreach”。 如果将结果存储在数组中,则可能称为“地图”。 Foldl通常会通过采用将数字加到总数中并返回新总数的函数本身来累积总数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM