为什么`toString`不等同于`window.toString`?

时间:2013-01-04 15:42:32

标签: javascript console global-variables firebug

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

但是,在网页(on 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

这是为什么?为什么window是Chrome控制台中的全局对象,但toString未绑定到window.toString? Firefox的控制台中toString绑定的是什么?控制台中还有哪些其他全局值不同?

3 个答案:

答案 0 :(得分:3)

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

window对象上总是

的实际全局变量。

答案 1 :(得分:2)

也许这与this question有关? 这一切都与背景有关,我相信

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

tostring.call("foot") != window.toString.call("foo") when this != window

答案 2 :(得分:1)

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

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

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