浏览器中的窗口对象是闭包还是其他构造

Is the window object in a browser a closure or some other construct?

本文关键字:其他 闭包 浏览器 窗口 对象      更新时间:2023-09-26

我不是一个全职的JS开发人员,尽管我觉得我已经和它一起工作了很久。大多数关于闭包的讨论都是有意义的。我很好奇全局window对象是否只是一个全局闭包?我读过http://lostechies.com/derickbailey/2011/11/30/is-javascripts-global-scope-really-just-a-closure/但它似乎并没有以肯定或否定的方式回答这个问题。

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

你提到的文章说:

看起来全局作用域不过是JavaScript内置的闭包支持的双产品,与运行时的最外层作用域(DOMWindow或CommonJS实现的其他作用域)相结合。

作者并不是说window是一个闭包,只是说所有东西都可以访问全局作用域,原因与闭包中的变量在内部作用域中可见的原因相同。这是真的。


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

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

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