高阶功能 - 使用Javascript(Higher order functions - Javas

2019-08-02 07:11发布

我通过雄辩的Javascript工作。 功能计数取作为参数阵列和测试功能( 等于(X)),并返回该测试函数返回真数组中元素的量。

据我所知,这些功能的工作,并在逻辑上参数,以降低匿名函数具有零值的广阔道路。

有人可以帮我看看哪里总价值是由专门虽然来了吗? 我想在我的脑海里更清晰的画面。

function count(test, array) {
  return reduce(function(total, element) { // Where is the value for total coming from?
    return total + (test(element) ? 1 : 0);
  }, 0, array);
}

function equals(x) {
  return function(element) {return x === element;};
}

function countZeroes(array) {
  return count(equals(0), array);
}

从早期的减少功能:

function reduce(combine, base, array) {
  forEach(array, function (element) {
    base = combine(base, element);
  });
  return base;
}

从早期的forEach功能:

function forEach(array, action) {
  for (var i = 0; i < array.length; i++)
    action(array[i]);
}

Answer 1:

你传给减少3个参数分别为:

{
    combine:function(total, element){...},
    base:0,
    array:array
}

然后该函数采用base ,并将其传递到combine函数作为total参数:

base = combine(base, element);

基本上,这里发生了什么是,你刚通过(作为第三参数中的阵列中的每个元件array )的函数将参数base和使用已提供的匿名函数(如果该元件通过其首先检查递增它test ) 。 最后,它遍历所有的元素后,它返回的最终值base

或许,这将有助于解释:

function count(test, testarray) {
  var anon = function(total, element) { // Where is the value for total coming from?
    return total + (test(element) ? 1 : 0);
  };
  //now anon is a function.
  return reduce(anon, 0, testarray);
}

让我们来看看函数调用和定义密切:

return   reduce(anon   , 0   , testarray);
                  |      |     |
                  v      v     v
function reduce(combine, base, array) {
    combine;    //the function that is passed in as the first argument
    base;       //the number that is passed in as the second argument
    array;      //the array that is passed in as the third argument

每一个的 anon0testarray ,得到传递给函数。 在函数,它们的值可以通过函数定义的参数名称来访问。



Answer 2:

我看到,减少被传递一个匿名函数,而不是组合函数

这是不是真的。 匿名函数 combine功能。

combine(base, element) VS function(total, element)

这两个函数调用基本上彼此相等:结合(碱,元件)和功能(总的,元素)?

不,它们是完全不同的事情。

前一个函数调用,通过引用的功能combine
第二,然而,计算为一个新的函数值。 如果是:

reduce(function(total, element) {...}, ...);

reduce()被传递函数值,这意味着什么是, 创建一个新的功能 ,接受两个参数的函数(表示为totalelement )。 然后,这个函数传递到reduce


让我从昨天回收我的可视化。 认识到,这并不只适用于你的情况是很重要的,但它适用于减少(左)概念的每一个实施方案。

                   return value of reduce()
                   /
                 etc ...
                /
            combine    
           /       \
       combine      xs[2]
      /       \
  combine      xs[1]
 /       \
0         xs[0]

当然,这只能说明发生了什么 ,而不是如何 ,我认为你的情况你问如何 。 只要保持这种可视化一点,看看结果是要干什么。

代功能

为了更清楚是怎么回事,我将逐步替代那些正在传递的功能。

启动程序:

function countZeroes(array) {
  return count(equals(0), array);
}

equals(0)你可以称之为钻营的一种形式)的计算结果为一个功能,即传递给count()

这导致基本以下count()函数:

function count(array) {
  return reduce(function(total, element) { // Where is the value for total coming from?
    return total + (0 == element ? 1 : 0);
  }, 0, array);
}

从这里,我们可以提取combine的说法:

function combine(total, element) { // Where is the value for total coming from?
    return total + (0 == element ? 1 : 0);
}

这是功能,即精简函数中使用:

function reduce(base = 0, array) {
  forEach(array, function (element) {
    base = combine(base, element);
  });
  return base;
}

reduce(0, array)从被呼叫count()函数。 传递给函数forEach现在可以改写这样的,考虑到我们的帐户实施的combine

function reduce(base = 0, array) {
  forEach(array, function (element) {
    base = base + (0 == element ? 1 : 0);
  });
  return base;
}

请记住,该base代表了我们的total

由于我们的最后一步,我们考虑什么forEach()做。

function reduce(base = 0, array) {
  for (var i = 0; i < array.length; i++)
    base = base + (0 == array[i] ? 1 : 0);
  }
  return base;
}

因此,这是count()本质上的样子,所有呼叫解开:

function count(array) {
  var base = 0;
  for (var i = 0; i < array.length; i++)
    base = base + (0 == array[i] ? 1 : 0);
  }
  return base;
}


文章来源: Higher order functions - Javascript