Javascript,窗口上下文

时间:2014-02-16 16:15:16

标签: javascript

我试着理解窗口对象如何包装我将解释的代码,例如我得到了这个理论:

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;

我真的觉得我明白了,但如果我错了,请纠正我。

3 个答案:

答案 0 :(得分:2)

假设您的网页上有一些脚本块:

<script>
  var loc = window.location;  
  ... 
</script>

当需要在该块中运行脚本时,以下是浏览器正在执行的操作:

  1. 创建窗口命名空间对象:

    var window = {}; window.window = window;

  2. 将原型设置为Window“class”

    window.__proto__ = Window;

  3. 将窗口上下文中的代码作为全局命名空间对象进行评估:

    internalEval("content of that script block", window);

  4. 对于加载到视图中的每个脚本块和外部脚本文件,执行#3。

  5. 所以如果你的脚本有这样的声明:

    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对象(这个名字很棒,是吗?)扮演这个角色。