我不是一个全职的JS开发人员,虽然我觉得我已经永远使用它了。大多数闭包的讨论都是有道理的。我很好奇全局window
对象是否只是一个全局闭包?我已阅读http://lostechies.com/derickbailey/2011/11/30/is-javascripts-global-scope-really-just-a-closure/,但它似乎没有以肯定或否定的方式回答这个问题。
答案 0 :(得分:5)
它是一个对象,所以它不能是一个闭包(闭包是函数,还有一个作用域链)。它也是全局范围对象,因为所有全局变量都是window
1 的属性。
你提到的文章说:
看起来全局范围只不过是JavaScript内置的闭包支持的双向产品,结合运行时的最外层范围(DOMWindow或CommonJS实现的其他范围)。 p>
作者并不是说window
是一个闭包,它只是说所有东西都可以访问全局范围,因为在内部范围中可以看到陷阱中存在的变量。那是真实的。
1 这包括对window
对象本身的引用,正如Rocket Hazmat所指出的那样。并且不止一个,有window
,self
,top
......所以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
对象不是闭包。