8

我相信所有全局变量都可以从全局对象访问。因此,如果我可以访问x(并且x没有在本地绑定),那么window.x是相同的值。

但是,在网页中(在 JSFiddle 上):

window === this // true in Chrome and Firefox
toString === window.toString // true in Chrome and Firefox

但在控制台中:

window === this // true in Chrome console and Firebug, false in Firefox web console
toString === window.toString // false in Chrome, Firebug and Firefox web console

为什么是这样?为什么windowChrome 控制台中的全局对象toString没有绑定到window.toStringtoStringFirefox 的控制台绑定了什么?控制台中还有哪些其他全局值不同?

4

3 回答 3

3

toString不是全局变量。它是几乎所有对象共享的方法,包括window对象。

实际的全局变量将始终window在对象上可用。

于 2013-01-04T15:46:01.310 回答
2

也许这与这个问题有关?这一切都与上下文有关,我相信

toString.call("foo") == this.toString.call("foo")

tostring.call("foot") != window.toString.call("foo") when this != window
于 2013-01-04T15:53:37.277 回答
1

我无法在 Firefox 中重现您的声明。他们都回来了[xpconnect wrapped native prototype]

为了帮助澄清这一点:全局可用的所有东西都可以通过全局对象获得。但是,可能存在通过全局对象可用的属性,这些属性不一定全局可用。这是由于 Javascript 中的原型继承模式以及缺乏关于如何处理这种情况的规范。

那么,解释器是否应该尝试通过全局对象链中的原型继承来解决全局查找?全局对象是否继承自其他对象?我认为各种 Javascript 解释器在这里是不一致的,但更熟悉 ECMAScript 规范的人可能会参与进来。

于 2013-01-04T16:06:44.057 回答