我试着理解窗口对象如何包装我将解释的代码,例如我得到了这个理论:
function window(){
// The window.window is in circular structure because window property on
// the window object is set to this (this.window = this)
// All the rest of the developer code goes here
}
window.call({});
这可能是一个糟糕的理论,但我想尝试,我的问题是窗口对象如何包装我的代码它是怎么样的,和如果我是关于window.window圆形结构吧?
修改
我想要理解的是窗口对象如何作为我的全局范围可用,它如何包装我的代码,它是否与我的示例相同或类似?,窗口对象如何在场景后面构建?
修改
谢谢你回答c-smile,请告诉我,如果我找对你,
internalEval函数是用java或c ++编写的javascript引擎函数,依此类推......?
另外,当您说脚本块时,您指的是<script></script>
之间的所有代码?
当您说“并且外部脚本文件已加载到视图中”时,您是否将根据窗口范围(全局范围)评估在html页面中创建的任何其他<script></script>
标记内容?
关于窗口对象:浏览器在任何脚本为var window = {};
之前执行的第一行代表我的全局范围,下一步是通过分配window.__proto__ = Window;
来构建空窗口对象,现在我相信Window(函数Window(){[native code]})被分配给该行之前的全局(窗口)对象:window.__proto__ = Window;
例如:
var window = {};
window.Window = function Window() { [native code] }
window.__proto__ = Window;
我真的觉得我明白了,但如果我错了,请纠正我。
答案 0 :(得分:2)
假设您的网页上有一些脚本块:
<script>
var loc = window.location;
...
</script>
当需要在该块中运行脚本时,以下是浏览器正在执行的操作:
创建窗口命名空间对象:
var window = {}; window.window = window;
将原型设置为Window“class”
window.__proto__ = Window;
将窗口上下文中的代码作为全局命名空间对象进行评估:
internalEval("content of that script block", window);
对于加载到视图中的每个脚本块和外部脚本文件,执行#3。
所以如果你的脚本有这样的声明:
someGlobalVar = 1234;
someGlobalVar将被创建为window对象的属性:
window.someGlobalVar; // -> 1234 value here
并且您无法使用名称window
创建全局函数作为该变量
已经定义并配置为只读。所以上面的window.window = window;
语句实际上是这样的:
Object.defineProperty(window, "window", {
enumerable: false,
configurable: false,
writable: false,
value: window
});
答案 1 :(得分:1)
“window”在任何执行上下文之前创建,不能用作全局范围内变量或例程的名称。这是一个很棒的参考@poke链接到:http://www.ecma-international.org/ecma-262/5.1/#sec-15.1
窗口对象用于检索有关窗口的信息,页面上的每个帧都有一个窗口对象。
以下是更多信息http://msdn.microsoft.com/en-us/library/ie/ms535873(v=vs.85).aspx
注意:MSDN文章和EMCAScript中存在一些不一致之处。 @Poke在评论中指出。
答案 2 :(得分:1)
根据the specification,需要有一些全局对象可以完成某些任务。它提供了the global environment,即最远的范围。在任何JavaScript代码实际运行之前,全局对象是由JavaScript引擎本身创建的;并且你无法真正表达它在JavaScript代码本身中是如何工作的。
对于在带有DOM的上下文中执行的浏览器,window
恰好是该全局对象。每个JavaScript运行时都会有一个;但它取决于它在哪里运行。例如,在Node中,global
对象(这个名字很棒,是吗?)扮演这个角色。