我的问题是关于此功能的:
function d() {
function e() {
alert('E');
}
return e;
}
d()();//alerts 'E'
在第一次调用函数 d 时,返回了函数 e ,但是,在此没有任何内容引用返回的值(函数 e 情况),则此返回值应该丢失。那么,此 d()()如何工作?根据我的理解,这不是关闭。谢谢!
答案 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
完整的表达式已完成。没有什么可做的。该引用不会存储在任何地方,并且在解析此表达式之后,将立即丢弃所有从其评估返回的内容。