2

我不是一个全职的 JS 开发者,尽管我觉得我一直在使用它。大多数关于闭包的讨论都是有道理的。我很好奇全局window对象是否只是一个全局闭包?我已经阅读了http://lostechies.com/derickbailey/2011/11/30/is-javascripts-global-scope-really-just-a-closure/但它似乎没有回答是或-没门。

4

2 回答 2

5

它是一个对象,所以它不能是一个闭包(闭包是函数,加上一个作用域链)。它也是全局范围对象,因为所有全局变量都是window1的属性。

你提到的那篇文章说:

看起来全局范围只不过是 JavaScript 内置在其中的闭包支持的副产品,与运行时的最外层范围(DOMWindow 或 CommonJS 实现的其他范围)相结合。

作者并不是说那window是一个闭包,它只是说一切都可以访问全局范围,原因与封闭在闭包中的变量在内部范围中可见的原因相同。那是真实的。


1window正如 Rocket Hazmat 所指出的,这包括对物体本身的引用。而且不止一个,还有window, self, top... 所以window.window.top.window.self === window. 事实上,之所以可以全局访问,是因为在全局对象( )window中有对它的引用。=== itself另请参阅:我对为什么在 JavaScript 中将顶级函数创建为窗口方法的回答?,以及它下面的评论。

于 2013-08-23T19:29:25.610 回答
1

它是一个对象。您可以向其添加属性并从中调用属性。您使用的许多标准函数实际上是window对象的一部分,但可以省略。如果您在脚本中创建一个新窗口,它将有自己的window对象,您可以引用和操作。

闭包为变量创建一个作用域,就像一个窗口创建一个作用域一样。但是,闭包是一个函数,因此window对象不是闭包。

于 2013-08-23T19:33:34.350 回答