我想问一下这个函数:
function d() {
function e() {
alert('E');
}
return e;
}
d()();//alerts 'E'
当函数 d 第一次被调用时,函数 e 被返回,但是没有任何东西引用返回的值(在这种情况下是函数 e ),因此这个返回的值应该会丢失。那么,d()() 是如何工作的呢?根据我的理解,这不是一个闭包。谢谢!
我想问一下这个函数:
function d() {
function e() {
alert('E');
}
return e;
}
d()();//alerts 'E'
当函数 d 第一次被调用时,函数 e 被返回,但是没有任何东西引用返回的值(在这种情况下是函数 e ),因此这个返回的值应该会丢失。那么,d()() 是如何工作的呢?根据我的理解,这不是一个闭包。谢谢!
d()
`)返回 `e`,然后最后一个 `()` 立即调用该函数。function n() { return 5; }
console.log(n() + 1); // 6
没有任何地方保存了调用 n()
的返回值,但是返回值可以在加法操作中使用。同样地,调用 d()
的返回值也可以被用作函数调用表达式中的函数引用,这恰好是你代码中发生的事情。
换句话说,d()
返回一个函数的引用(e
)。为了调用一个函数,你只需要从 某个地方 取得函数的引用和带括号的参数列表。这就是 d()()
给你的东西。
()
函数调用只是另一个操作符。function returnTwo() {
return 2;
}
console.log(returnTwo() + 40);
returnTwo()
的结果,但我们仍然可以将其用作+
运算符的左操作数。因此,使用您示例中的函数调用时,您正在执行相同的操作。function d() {
function e() {
alert('E');
}
return e;
}
d()();
//alerts 'E'
它不需要引用,因为它明确地转换为返回值。除非存储,否则JavaScript表达式的结果(一系列解释变量、函数和/或操作,返回一个值)将被完全评估,然后从内存中删除。关键在于它必须被完全评估
。你几乎可以把函数执行看作是水平的俄罗斯套娃。JavaScript表达式是:
d()();
d()
被执行并返回:
function e() { ... }
将该行转换为:
function e() { ... }()
然后执行,弹出警告框,并返回:
//nothing