JavaScript - 这个高级功能的含义
首先抱歉,如果我没有发布在正确的地方,或者如果已经有重复,但我不知道该怎么称呼它或如何搜索它。JavaScript - 这个高级功能的含义
可有人请向我解释什么下面的代码的意思是:
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);
我该怎么称呼这种类型的函数调用?
在此先感谢!
这是棘手的东西。 (Boolean)
可能会让你失望,但实际上它只是一个常规的旧参数。您可以使用doStuff
等功能代替Boolean
,它仍然可以工作。
是的,正如你所指出的,这是一个重复的问题。你正在寻找一种叫做“关闭”的东西。这里是从*的一个梦幻般的回答:
感谢您的回答,这真的帮了我很大的忙,我甚至发现我在闭门时仍然不够好,否则我会知道这是一个。 –
阅读你发布的链接后,例6实际上解释了我的疑问。非常感谢! –
不客气!也许我还应该澄清一点,实际上,在您的示例中,您也正在处理[高阶函数](https://en.wikipedia.org/wiki/Higher-order_function)(请参阅简单定义的链接)。高阶函数的一个例子是[回调函数](http://www.learn-js.org/en/Callbacks)(请参阅链接以获得简单解释)。 –
“嘈杂”是一种函数,如果您调用它,它将返回一个函数。
通过将Boolean
转换为函数,Boolean
被称为Boolean(0)
,结果为false
,因为0是一个虚假值。
Boolean
只是一个构造函数,您可以使用它来创建布尔值或将任何值转换为布尔值。
您需要通过一个f
- 它可能不是Boolean
函数。尝试
const increment = x => x+1;
const noisyInc = noisy(increment);
console.log(noisyInc(1));
在你的原代码,中间变量被忽略 - 就像我在这里写noisy(increment)(1)
。
对于它的价值,它*可能*是其他任何东西。使用'Boolean'也可以工作,因为'Boolean'只会在没有'new'的情况下使用它将(转换)值转换为布尔值(并返回)。 – towerofnix
@towerofnix是的,这就是'布尔'的作用。 – Bergi
您正在调用函数noisy(...)
,该函数返回使用其参数中的信息构造的另一个函数。该函数调用noisy(Boolean)(0);
实际上是两个函数调用,并可能(或许应该)写为:
var noisyFunction = noisy(Boolean)
noisyFunction(0)
是noisy()
取一个函数的事实(Boolean
是一个函数MDN)。对这里使用的语法没有实际影响,它可能不需要任何参数,或者不需要任何参数。
您对高阶函数标签的选择真的很有用。这是一个编程的例子。在noisy
返回之后,f
值noisyFunction
可用的事实是关闭(MDN)的结果。有些程序员可能会将其描述为“使用闭包”,但它并不特定于所示的模式。
感谢您的回答,与其他答案类似,您帮助我向我解释我可以以多种方式调用相同的函数,现在看起来像我习惯看到的闭包类型! –
*“?为什么我需要调用函数后有(布尔)” *这不是* *后的函数调用。 '吵闹(布尔)'*是函数调用。你打电话给'吵吵闹闹'传递'布尔'作为参数。 –