You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中顶层函数是否会形成闭包?

关于闭包的基础疑问解答

先看你给出的第一个典型闭包例子:

function makeCounter() {
  let count = 0;

  return function() {
    return count++;
  };
}

let counter = makeCounter();

这里返回的内部函数确实和count形成了闭包——当makeCounter执行完毕后,它的内部作用域本应被销毁,但因为返回的函数还持有对这个作用域的引用,count变量得以保留,后续调用counter()时依然能访问并修改它,这是闭包最典型的表现。

再看第二个顶层函数的例子:

var x = 1;

function func() {
  console.log(x); // func是否与x形成闭包?
}

func();

从严格的闭包理论定义来说,func确实和全局变量x形成了闭包——闭包的本质是函数能够访问并保留自己定义时所在的词法作用域,不管函数在哪里执行。func定义在全局作用域,能访问全局作用域的x,完全符合这个定义。

但在日常开发和大多数技术讨论的语境里,我们几乎不会把这种情况称为闭包。原因是闭包最核心的价值和被关注的场景,是嵌套函数访问外部函数的局部作用域,并且外部函数执行完毕后,内部函数依然能保留这个即将被销毁的作用域。而全局作用域在整个程序运行期间始终存在,不存在“保留即将销毁的作用域”这个关键特性,所以这种场景通常不会被归类为闭包讨论的范畴。

总结一下:

  • 不是只有嵌套函数才会形成闭包,顶层函数访问全局变量的情况理论上也符合闭包定义
  • 但我们日常说的“闭包”,几乎都是指嵌套函数保留外部函数局部作用域的场景

内容的提问来源于stack exchange,提问作者piyush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:05:23