无外部变量引用的嵌套函数中是否存在Closure?附代码求证
闭包判定问题解答
未引用外层函数变量的嵌套函数是否存在闭包?
这个问题的判定核心取决于你采用的闭包定义:
- 狭义实用定义:只有捕获了外层作用域自由变量的嵌套函数才属于闭包。按照这个标准,没有引用外层变量的嵌套函数不存在闭包,这也是日常开发、技术面试中最常用的判定规则。
- ECMAScript规范定义:闭包是函数对象与其创建时的词法环境的绑定关系,只要嵌套函数在创建时会关联外层作用域的词法环境,不管是否实际用到外层变量,都属于闭包范畴。
另外补充实际运行时的引擎优化逻辑:主流JS引擎(比如V8)会做逃逸分析,如果检测到嵌套函数没有引用外层作用域的任何变量,会直接优化掉对父级词法环境的持有,实际执行时不会生成闭包。
给出的代码是否存在闭包?
你提供的代码如下:
function foo(){ return function foo2(){ console.log("Inner Function"); } } let x = foo(); x();
判定结果同样和采用的标准相关:
- 按日常常用的狭义定义:
foo2没有引用foo作用域内的任何变量,不存在闭包。 - 按ECMAScript规范定义:
foo2作为被返回的嵌套函数,持有foo的词法环境引用,存在闭包。 - 按实际引擎执行结果:V8等现代引擎会优化掉
foo2对foo作用域的引用,运行时不会产生闭包。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

