关于函数d()返回函数e后直接执行d()()的运行原理咨询
为什么
d()()能正常运行? 好问题!咱们一步一步拆解这个代码的执行过程,就能明白原因了:
首先看你的代码:
function d() { function e() { alert('E'); } return e; } d()();//alerts 'E'
执行步骤拆解
- 当你运行
d()()时,JavaScript引擎会先执行第一个()调用d函数。 - 在
d函数内部,定义了e函数,随后把e作为返回值返回。 - 这时候,返回的
e函数并没有立刻被垃圾回收——因为紧接着的第二个()正等着调用它!引擎会把这个返回值临时存储在内存中,直到完成e()的调用操作。 - 等
e()执行完毕(弹出了'E'的提示框),这个e函数才会失去所有引用,之后垃圾回收机制才会将它回收。
关于闭包的判断
你说得完全对!这不属于闭包。闭包的核心特征是内部函数引用了外部函数作用域中的变量,并且即使外部函数执行完毕,内部函数依然能访问这些变量。但这里的e函数没有引用d作用域里的任何变量,所以和闭包没有关系。
简单来说:垃圾回收只会回收没有任何引用的值,而d()返回的e在被调用前,还有第二个()这个“临时使用的引用”,所以不会被回收,自然能正常执行啦。
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

