我通过雄辩的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]);
}
你传给减少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
每一个的值 anon
, 0
和testarray
,得到传递给函数。 在函数,它们的值可以通过函数定义的参数名称来访问。
我看到,减少被传递一个匿名函数,而不是组合函数
这是不是真的。 匿名函数是 combine
功能。
combine(base, element)
VS function(total, element)
这两个函数调用基本上彼此相等:结合(碱,元件)和功能(总的,元素)?
不,它们是完全不同的事情。
前一个函数调用,通过引用的功能combine
。
第二,然而,计算为一个新的函数值。 如果是:
reduce(function(total, element) {...}, ...);
reduce()
被传递函数值,这意味着什么是, 创建一个新的功能 ,接受两个参数的函数(表示为total
和element
)。 然后,这个函数传递到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;
}