我相信所有全局变量都可以从全局对象中访问。因此,如果我可以访问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
绑定的是什么?控制台中还有哪些其他全局值不同?
答案 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规范的人可能会权衡。