JavaScript中的"return function() { ... }"是什么意思?

8

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

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

请解释这个的作用!

因为我之前认为这很困难,所以请不要给我 downvote :D - Rakesh Juyal
“upvote” - 因为一阶函数,特别是在调用函数返回的函数时(例如 f()()),看起来确实令人困惑,直到你“懂了”。 - Andrzej Doyle
恭喜,Rakesh Juyal!你刚刚偶然发现了“函数式编程”!我为你感到非常高兴 抽泣 - Lambda Fairy
5个回答

9
它执行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

Mox,你可能是正确的,但你能否解释一下呢? - Rakesh Juyal
F是一个函数,它接受一个函数(称为arg1),并返回一个函数,该函数将显示由函数arg1返回的值。这正确吗? - Rakesh Juyal

6

这只是一个更高级别的函数,在这种情况下并不是真正必要的。

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

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

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

alert("Hello World");

但是还有两个额外的元素使其更加复杂:

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

但由于代码片段中实际上没有使用这些好处,所以我可以理解为什么您会感到困惑。


3

要在弹出框中显示“Hello world”,需要使用一种非常复杂的方法。在JavaScript中,函数是一等公民,可以作为参数传递给其他函数,也可以从其他函数中返回。


2
这段代码创建了一个函数生成器。第一个函数(其引用存储在f中)接受对另一个函数(a)的引用。然后,f创建一个闭合于参数a的函数,并返回对新函数的引用,该函数将警报a调用结果的返回值。
最后,这个混乱的东西使用内联函数调用,并立即调用其结果(在结尾处带有括号)。

0

f 被赋予一个函数,该函数以另一个函数作为其参数,调用它,并在 alert 中显示其返回值。然后,f 被调用,传入一个函数作为参数,当该函数被调用时返回字符串 "Hello World",结果在警告框中显示 Hello World


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接