【问题标题】:Global variables: Global Execution Context object or Window object?全局变量:全局执行上下文对象还是窗口对象?
【发布时间】:2015-01-19 03:40:19
【问题描述】:

全局变量真正存储在哪里?我知道这个question 存在,但我目前正在阅读一本书,它说全局变量存储为全局执行上下文对象的属性。

但我在第一段中包含的链接说它们是 Window 对象的属性。那么 Window 和 Global Execution Context 对象之间是什么关系,如果有的话?如果没有,是不是我读错了书?

【问题讨论】:

  • 两者都可以。我认为全局执行上下文是指实现,它不一定意味着window 对象。 window 对象是浏览器中的全局对象。
  • “很多宿主环境会在全局对象中放一个属性,其值是对全局对象本身的引用”,所以不一定叫window,但还是引用全局对象
  • 没有“全局执行上下文对象”,但有一个global object 和一个global execution context。 ;-)

标签: javascript


【解决方案1】:

全局变量真正存储在哪里?

全局变量是全局执行上下文中lexical environment的属性,就像函数变量是函数词法环境的属性一样。

为方便起见,它们也被设为全局对象的属性。

我目前正在阅读一本书,它说全局变量存储为全局执行上下文对象的属性。

或多或少。 ES5 的术语发生了变化,之前有一个变量对象的概念,用于在执行上下文中存储变量,但它只是一个规范设备,而不是可以访问的实际对象。

ES5 引用了一个词法环境,其中包括一个变量环境,参见EMCA-262 §10.3

但我在第一段中包含的链接说它们是 Window 对象的属性。

在浏览器中,window 对象实际上是全局对象的别名。 window 是一个宿主对象,因此它可以拥有比内置全局对象更多的属性和方法。

那么 Window 和 Global Execution Context 对象有什么关系呢?

我想上面已经解释过了。简而言之,在浏览器中,全局对象和窗口对象实际上(但不完全)是一回事。

如果没有,是我读错了书吗?

不,但这似乎让您感到困惑。 ;-)

另见:MDN: Window.window

【讨论】: