我正在阅读 Eloquent JavaScript ( The new edition ),并且读到了有关高阶函数的部分,但我对以下代码中发生的情况感到困惑。
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
为什么函数的调用如此嘈杂? (Boolean) 是强制转换吗?选 Actor 是为了什么?返回值?或论证?如果它是返回值,为什么不 (Boolean)noisy(0) 呢?或者,如果参数是正在转换的参数,则为“noisy((Boolean) 0)”。
noisy(Boolean)(0)
这一行发生了什么? f() 是在哪里定义的?
var val = f(arg);
最佳答案
Boolean
是一个函数。这是您通过noisy
间接调用的函数。我知道有点令人困惑,因为它看起来像一个类型的名称。但在 JavaScript 中,那些初始上限的东西(Boolean
、Number
、String
等)是函数 。当您调用Boolean
(不使用new
)时,它会尝试将您提供的参数转换为boolean
原始值并返回结果。 (请参阅规范中的 §15.6.1。)f
是noisy
函数中参数的名称。
JavaScript 中的函数是一流的对象。您可以将它们作为参数传递到其他函数中,就像任何其他对象一样。
当你这样做时
noisy(Boolean)(0)
有两件事正在发生。第一:
// (In effect, we're not really creating a variable...)
var x = noisy(Boolean);
这为我们提供了一个函数,在调用时,它将使用我们给它的参数调用 Boolean
,同时执行这些 console.log
语句。这是您在 noisy
中看到的创建函数 (return function(arg)...
);
然后我们调用该函数:
x(0);
这时您就会看到控制台输出。由于 Boolean(0)
为 false
,因此您会看到 Boolean
返回该值。
这是一个更简单的示例:
function foo(bar) {
bar();
}
function testing() {
alert("testing got called");
}
foo(testing);
在那里,我将函数 testing
传递给 foo
。我在 foo
中使用的参数名称是 bar
。 bar();
行调用该函数。
关于javascript - Javascript 中的高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23535316/