函数返回函数,无参考

时间:2019-03-29 22:53:21

标签: javascript function

我的问题是关于此功能的:

    function d() {
       function e() {
        alert('E');
       }
       return e;
    }
    d()();//alerts 'E'

在第一次调用函数 d 时,返回了函数 e ,但是,在此没有任何内容引用返回的值(函数 e 情况),则此返回值应该丢失。那么,此 d()()如何工作?根据我的理解,这不是关闭。谢谢!

3 个答案:

答案 0 :(得分:4)

对d的调用(在最后一行为d())返回e,然后最后一个()立即调用该函数。

考虑

function n() { return 5; }

console.log(n() + 1); // 6

没有任何东西保存对n()的调用的返回值,但是该返回值可以在加法运算中使用。调用d()的返回值可以类似地用作对函数调用表达式中的函数的引用,这正是代码中发生的情况。

换句话说,d()返回对函数(e)的引用。为了调用一个函数,您所需要做的就是引用从 somewhere 提取的一个函数以及一个带括号的参数列表。这就是d()()给您的。

答案 1 :(得分:1)

使用该函数不需要命名引用。您可以将运算符应用于任何表达式的结果,()函数调用只是另一个运算符。

因此,它与对函数调用的结果执行加法运算没有什么区别。

function returnTwo() {
  return 2;
}

console.log(returnTwo() + 40);

这里我们不存储returnTwo()的结果,但是我们仍然可以将其用作+运算符的左操作数。因此,在示例中使用函数调用,您正在做相同的事情。

答案 2 :(得分:0)

function d() {
   function e() {
    alert('E');
   }
   return e;
}
d()();
//alerts 'E'

它不需要引用,因为它已显式转换为返回值。除非存储,否则将完全评估JavaScript Expression(返回值的解释变量,函数和/或操作的序列)的结果,然后将其从内存中删除。关键是它必须为fully evaluated。您几乎可以将功能执行视为水平的俄罗斯嵌套娃娃。 JavaScript表达式为:

d()();

所以它从左到右开始:

d()

执行并返回:

function e() { ... }

将行变成:

function e() { ... }()

然后执行,发出警报并返回:

//nothing

完整的表达式已完成。没有什么可做的。该引用不会存储在任何地方,并且在解析此表达式之后,将立即丢弃所有从其评估返回的内容。