雄辩的Javascript:高阶函数示例
Eloquent Javascript: Higher Order Functions example
function reduceAncestors(person, f, defaultValue) {
function valueFor(person) {
if (person == null)
return defaultValue;
else
return f(person, valueFor(byName[person.mother]),
valueFor(byName[person.father]));
}
return valueFor(person);
}
function sharedDNA(person, fromMother, fromFather) {
if (person.name == "Pauwels van Haverbeke")
return 1;
else
return (fromMother + fromFather) / 2;
}
var ph = byName["Philibert Haverbeke"];
console.log(reduceAncestors(ph, sharedDNA, 0) / 4);
// → 0.00049
我很难理解来自Eloquent Javascript的这个例子。这是高阶函数章节(第 5 章(末尾的示例,标题为"曾-曾-曾......"我看不出母亲和父亲从哪里得到他们的价值观。我认为他们指的是valueFor(byName[person.mother]和valueFor(byName[person.father](,但我看不出"valueFor"函数如何或何时从数据中检索实际的数字值(请注意,我显然没有在这篇文章中包含数据,也没有包括byName函数(。提前感谢任何帮助!
reduceAncestors(ph, sharedDNA, 0) / 4)
将sharedDNA
函数作为第二个参数传递。
它被分配给f
这里:
function reduceAncestors(person, f, defaultValue)
f
在这里被调用:
f(person, valueFor(byName[person.mother]), valueFor(byName[person.father]));
。在这里,您可以看到分配给fromMother
和fromFather
的第二个和第三个参数:
function sharedDNA(person, fromMother, fromFather) {
您可以看到如下:
首先,f
和sharedDNA
在此特定调用的执行期间是相同的。
其次,valueOf
可以返回以下值:
-
0,当
person == null
-
1、
person == "Pauwels van Haverbeke"
时(见shareDNA
( -
0 到 1 之间的另一个值由先前计算的值的平均值:
(fromMother + fromFather) / 2
因此,如果在"Philibert Haverbeke"的祖先中找不到"Pauwels van Haverbeke",则最终值将为0。
但是,如果发现"Pauwels van Haverbeke"是"Philibert Haverbeke"的直接父级,那么在console.log
除以4之前的最终值是
(0 + 1) / 2 = 1/2
如果发现"Pauwels van Haverbeke"作为祖父母,则最终值为
((0 + 0) / 2 + (0 + 1) / 2) / 2 = 1/4
更一般地说,如果发现他可以追溯到n代前,最终值是
2 ^ (-n)
现在 2 ^ (-11( 恰好是 0.0004882813...,所以您的(四舍五入(结果 0.00049 意味着 Pauwels van Haverbeke 是 Philibert Haverbeke 的祖先,早 9 代,考虑到在 console.log
中有 4 的除法。
- JavaScript 中的高阶函数
- 避免在JS中重复使用高阶函数
- 回调和高阶函数Javascript
- 什么's将命名函数传递给Javascript的正确方法's的高阶函数
- Javascript如何使用高阶函数和Map/Reduce函数来汇总多个数组
- 使用JavaScript中的高阶函数概念,用Python编写纯函数代码
- 在高阶函数 JavaScript 中传递参数
- 如何在 Javascript 中使用高阶函数反转数组
- Eloquent JavaScript,第 2 版,第 5 章高阶函数
- JS中的高阶函数
- GHCJS:如何使用 FFI 导入高阶 JavaScript 函数
- 这个高阶函数有什么问题
- 如何在 Indesign 脚本中使用像 Array.reduce() 这样的高阶函数
- 此函数如何修改另一个函数?(高阶函数)
- 在es6类中从高阶函数中定义一个方法
- 将其绑定到高阶函数中的原始对象
- 高阶函数中的Javascript对象克隆
- 通过更改起始索引并使用Javascript中的高阶函数递增2来操作2D数组
- 将函数传递给另一个函数时的高阶函数说明
- 了解Javascript中的高阶函数