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); 

我该怎么称呼这种类型的函数调用?

在此先感谢!

+1

*“?为什么我需要调用函数后有(布尔)” *这不是* *后的函数调用。 '吵闹(布尔)'*是函数调用。你打电话给'吵吵闹闹'传递'布尔'作为参数。 –

这是棘手的东西。 (Boolean)可能会让你失望,但实际上它只是一个常规的旧参数。您可以使用doStuff等功能代替Boolean,它仍然可以工作。

是的,正如你所指出的,这是一个重复的问题。你正在寻找一种叫做“关闭”的东西。这里是从*的一个梦幻般的回答:

How do JavaScript closures work?

+0

感谢您的回答,这真的帮了我很大的忙,我甚至发现我在闭门时仍然不够好,否则我会知道这是一个。 –

+0

阅读你发布的链接后,例6实际上解释了我的疑问。非常感谢! –

+1

不客气!也许我还应该澄清一点,实际上,在您的示例中,您也正在处理[高阶函数](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)

+0

对于它的价值,它*可能*是其他任何东西。使用'Boolean'也可以工作,因为'Boolean'只会在没有'new'的情况下使用它将(转换)值转换为布尔值(并返回)。 – towerofnix

+0

@towerofnix是的,这就是'布尔'的作用。 – Bergi

您正在调用函数noisy(...),该函数返回使用其参数中的信息构造的另一个函数。该函数调用noisy(Boolean)(0);实际上是两个函数调用,并可能(或许应该)写为:

var noisyFunction = noisy(Boolean) 
noisyFunction(0) 

noisy()取一个函数的事实(Boolean是一个函数MDN)。对这里使用的语法没有实际影响,它可能不需要任何参数,或者不需要任何参数。

您对高阶函数标签的选择真的很有用。这是一个编程的例子。在noisy返回之后,fnoisyFunction可用的事实是关闭(MDN)的结果。有些程序员可能会将其描述为“使用闭包”,但它并不特定于所示的模式。

+0

感谢您的回答,与其他答案类似,您帮助我向我解释我可以以多种方式调用相同的函数,现在看起来像我习惯看到的闭包类型! –