首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript闭包

JavaScript闭包
EN

Stack Overflow用户
提问于 2022-02-26 19:19:06
回答 1查看 54关注 0票数 1

我对JavaScript中的闭包有疑问。我想知道的是,每个使用外部作用域变量的函数都是自动闭包吗?

看看代码示例,它是闭包吗?

代码语言:javascript
复制
const x = 2;
function foo() {
    console.log(x);
}

我还读过stackoverflow线程,它包含两个不一致的语句。“否”的答案链接到维基百科,并指出:

最后,只有在非局部变量范围之外时,闭包才能与具有空闲变量的函数区别开来,否则定义环境和执行环境是一致的,没有什么可以区分的(静态绑定和动态绑定无法区分,因为名称解析到相同的值)。

但是用户T.J.Crowder的评论中似乎有一些有效的观点。

对于其他语言来说,这可能是真的,也可能不是,但是在JavaScript中,所有函数都是闭包。在JavaScript中,这是他们固有的。对于其他上下文来说,闭包没有什么特别之处,因为这些闭包与仅在全局上下文中关闭的函数不同。详见第9.2.5节- FunctionCreate及其用途。 它们都是闭包(在JS中),因为全局变量在JavaScript中工作的机制与关闭来自其他上下文的变量的机制完全相同。根本没有区别。这种“带自由变量的函数”与“闭包”的语义区分对于我不太熟悉的语言(如JavaScript )可能有效,也可能无效。正如我在回答中所说,我们通常不会称它们为闭包,除非您使用它们来访问非全局的语言。但这并不意味着它们不是闭包。:-)

回到第一个代码片段,基本上"foo“必须返回函数,然后返回控制台日志?或者它不会是闭包,"x“变量应该被移到foo的体内?

是像这样吗?

代码语言:javascript
复制
function foo() {
    const x = 2;
    return () => console.log(x);
}

我很困惑。

EN

回答 1

Stack Overflow用户

发布于 2022-02-26 19:44:32

我建议--如果没有--检查关于闭包的非常详尽的MDN文档 (并且有很多例子)。

在链接页面的第一段中,您只需找到问题的答案:

在JavaScript中,每次创建函数时都会创建闭包()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71279619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档