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

时间:2013-08-23 19:24:59

标签: javascript

我不是一个全职的JS开发人员,虽然我觉得我已经永远使用它了。大多数闭包的讨论都是有道理的。我很好奇全局window对象是否只是一个全局闭包?我已阅读http://lostechies.com/derickbailey/2011/11/30/is-javascripts-global-scope-really-just-a-closure/,但它似乎没有以肯定或否定的方式回答这个问题。

2 个答案:

答案 0 :(得分:5)

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

你提到的文章说:

  

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

作者并不是说window是一个闭包,它只是说所有东西都可以访问全局范围,因为在内部范围中可以看到陷阱中存在的变量。那是真实的。


1 这包括对window对象本身的引用,正如Rocket Hazmat所指出的那样。并且不止一个,有windowselftop ......所以window.window.top.window.self === window。事实上,window全局可访问的原因是因为在全局对象(=== itself)中有对它的引用。另请参阅:my answer Why top level functions are created as methods of window in JavaScript? 以及其下方的评论。

答案 1 :(得分:0)

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

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