当我在第5章遇到这个时,我正在阅读Eloquent JavaScript:
你可以拥有创造新功能的功能。
function greaterThan(n) { return function(m) { return m > n; }; } var greaterThan10 = greaterThan(10);
你可以拥有改变其他功能的功能。
function noisy(f) { return function(arg) { console.log("calling with", arg); var val = f(arg); console.log("called with", arg, "- got", val); return val; }; } noisy(Boolean)(0); //->calling with 0 //->called with 0 - got false
我的问题是:
答案 0 :(得分:4)
区别在于noisy
的参数是另一个函数,而不是像数字那样的“普通”值。所以,是的,它创建了一个新的匿名函数,就像greaterThan
一样,但它是修改其行为的现有函数的包装器。
在这种情况下,包装器只是在调用原始函数f
之前和之后记录一些消息。但是你可以做其他事情,比如修改它的参数或它的返回值。例如,您可以实现partial function application,它允许您在程序中的某一点为函数调用提供一些参数,并在新函数中“记住”这些参数只是剩下的论点。
答案 1 :(得分:1)
以上两个例子有何不同?
greaterThan
接受参数n
,该参数是一个数字。
noisy
接受一个参数f
,该参数旨在成为一个可以在其中调用的函数。
greaterThan
仅评估数字,noisy
更灵活,因为它可以接受任何函数并执行它。
嘈杂如何改变布尔值?
noisy
返回一个匿名函数,该函数在将结果存储在名为Boolean
的变量的行中评估val
。