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
相关产品推荐
相关产品推荐

