什么是;返回函数(){…}";你喜欢JavaScript吗?

什么是;返回函数(){…}";你喜欢JavaScript吗?,javascript,function,Javascript,Function,最近我看到了这段JavaScript代码,但一直无法理解它试图做什么 var f = function(a) { return function() { alert(a()); }; }; f(function() { return "Hello World"; })(); 请解释一下这能实现什么 获取警报框以显示“Hello world”是一种非常复杂的方法。函数是javascript中的第一类项,可以作为参数传递给其他函数或从其他函数传递。它执行f返回的函

最近我看到了这段JavaScript代码,但一直无法理解它试图做什么

var f = function(a) {
    return function() {
        alert(a());
    };
};
f(function() { return "Hello World"; })(); 

请解释一下这能实现什么

获取警报框以显示“Hello world”是一种非常复杂的方法。函数是javascript中的第一类项,可以作为参数传递给其他函数或从其他函数传递。

它执行f返回的函数。
f返回一个函数,该函数调用一个警报,该警报显示作为参数提供给f的函数的输出

编辑: 只需更换一些部件,使其更容易在眼睛上看到,您就会看到自己:

var f = function(a) {
    var output = a();
    var alertCaller = function() {
        alert(output);
    };
    return alertCaller;
};

var helloWorld = function() { return "Hello World"; }
var result = f(helloWorld); //f takes a function as argument
result(); //result must be a function

此代码创建一个函数生成器。第一个函数(其引用存储在
f
)接受对另一个函数(
a
)的引用。然后
f
创建一个关闭参数
a
的函数,并返回对新函数的引用,该引用将提醒
a的
调用结果的返回值


最后,使用内联函数调用此mess,并立即调用其结果(末尾带有左括号和右括号)。

它只是一个更高级别的函数,在这种情况下并不需要

f
是一个函数,它接受另一个函数(称为
a
),并返回一个新生成的函数,该函数将计算
a
,并弹出一个显示结果的警报框

因此,底线调用f(传入一个打印“Hello World”的匿名函数),然后立即计算由
f
返回的匿名函数,该函数将计算传入的参数(您可以看到该参数返回“Hello World”),然后弹出一个警报框

发布的代码在功能上等同于

alert("Hello World");
但有两个额外的因素使它更复杂:

  • 您可以传入任意函数以生成警报框中显示的字符串(这将被延迟评估,这可能很重要-例如,当显示警报而不是创建方法时打印当前时间/应用程序状态/内存使用情况的函数)
  • 您可以生成一个闭包来显示此警报,然后将其传递给其他人,而不是立即执行警报

  • 但是,由于这两个优点实际上都没有在代码片段中使用,我可以理解为什么您会感到困惑。

    f
    被分配了一个函数,该函数将函数作为其参数,调用它,并在
    警报中显示其返回值。然后用一个函数调用
    f
    ,该函数在调用时返回字符串
    “Hello World”
    ,导致
    Hello World
    显示在警报中。

    downvote:D,因为它不像我想的那么难?upvote-因为一阶函数,尤其是调用从函数调用返回的函数(例如,
    f()()
    )看起来确实令人困惑,直到你“理解”它。祝贺你,Rakesh Juyal!你刚刚偶然发现了函数式编程!我为你感到高兴sobmox,也许你是对的,但请你解释一下。F是一个函数,它接受一个函数(比如说arg1),并返回一个函数,该函数将显示函数arg1返回的值?这是正确的吗?