首先抱歉,如果我没有在正确的地方发帖或者已经有重复,但我不知道该怎么称呼它或如何搜索它。
有人可以向我解释以下代码的含义:
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
为什么在函数调用后需要(布尔)?
noisy(Boolean)(0);
我称这种函数调用是什么?
提前致谢!
答案 0 :(得分:5)
这很棘手。 (Boolean)
可能会让你离开这里,但实际上它只是一个常规的旧参数。您可以将Boolean
替换为任何功能,例如doStuff
,并且它仍然有效。
是的,正如你所指出的,这是一个重复的问题。你正在寻找一种叫做"封闭的东西。"这是StackOverflow的绝佳答案:
答案 1 :(得分:2)
“noisy”是一个函数,如果你调用它就会返回一个函数。
通过将Boolean
传递给函数,Boolean
被调用为Boolean(0)
,结果为false
,因为0是假值。
Boolean
只是一个构造函数,可用于创建布尔值或将任何值转换为布尔值。
答案 2 :(得分:2)
您正在调用函数noisy(...)
,该函数返回另一个函数,该函数使用其参数中的信息构造。 函数调用 noisy(Boolean)(0);
实际上是两个函数调用,可以(可能应该)写成:
var noisyFunction = noisy(Boolean)
noisyFunction(0)
noisy()
接受函数的事实(Boolean
是函数MDN)。对这里使用的语法没有实际影响,它可能不需要参数,或者更少的东西。
您选择的高阶函数标签实际上总结了它。这是用它们编程的一个例子。在f
返回后,noisyFunction
可以使用值noisy
的事实是闭包(MDN)的结果。然后,一些程序员可能会将此描述为"使用闭包",但它并不特定于所显示的模式。
答案 3 :(得分:1)
您需要传递f
- 它可以是Boolean
函数以外的任何内容。尝试
const increment = x => x+1;
const noisyInc = noisy(increment);
console.log(noisyInc(1));
在原始代码中,省略了中间变量 - 就像我在这里写noisy(increment)(1)
一样。