函数返回函数和无引用

3

我想问一下这个函数:

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

当函数 d 第一次被调用时,函数 e 被返回,但是没有任何东西引用返回的值(在这种情况下是函数 e ),因此这个返回的值应该会丢失。那么,d()() 是如何工作的呢?根据我的理解,这不是一个闭包。谢谢!


1
在汇编语言(低级编程)中,有所谓的“累加器”寄存器,它是处理器内部非常特殊的寄存器,用于存储每个操作的输入和输出。例如,要进行加法运算,您需要将一个值加载到累加器中,再将另一个值添加到其中,然后从累加器中加载结果。今天的编程语言仍然受到这种影响。 - Jonas Wilms
3个回答

4
调用 `d()` (即最后一行的 `d()`)返回 `e`,然后最后一个 `()` 立即调用该函数。
考虑:
function n() { return 5; }

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

没有任何地方保存了调用 n() 的返回值,但是返回值可以在加法操作中使用。同样地,调用 d() 的返回值也可以被用作函数调用表达式中的函数引用,这恰好是你代码中发生的事情。

换句话说,d() 返回一个函数的引用(e)。为了调用一个函数,你只需要从 某个地方 取得函数的引用和带括号的参数列表。这就是 d()() 给你的东西。


2
一个更基本的例子是IIFE。 - Taplar
@Taplar 当然可以;我只是觉得简单的算术可能更容易理解。 - Pointy
是的,不要分散注意力。只是想到其他常见的例子。 - Taplar

1
你不需要给一个函数命名引用才能使用它。你可以直接对任何表达式的结果应用操作符,而()函数调用只是另一个操作符。
因此,这与对函数调用结果执行加法没有太大区别。

function returnTwo() {
  return 2;
}

console.log(returnTwo() + 40);

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

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

它不需要引用,因为它明确地转换为返回值。除非存储,否则JavaScript表达式的结果(一系列解释变量、函数和/或操作,返回一个值)将被完全评估,然后从内存中删除。关键在于它必须被完全评估。你几乎可以把函数执行看作是水平的俄罗斯套娃。JavaScript表达式是:

d()();

所以它从左到右开始,其中包含:


d()

被执行并返回:

function e() { ... }

将该行转换为:

function e() { ... }()

然后执行,弹出警告框,并返回:

//nothing

完整的表达式已完成。它没有剩余任务。引用未存储在任何地方,并且在解析此表达式后,从其评估返回的所有内容都将被丢弃。

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