我对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的体内?
是像这样吗?
function foo() {
const x = 2;
return () => console.log(x);
}我很困惑。
发布于 2022-02-26 19:44:32
https://stackoverflow.com/questions/71279619
复制相似问题