【问题标题】:Why isn't `toString` equivalent to `window.toString`?为什么 `toString` 不等同于 `window.toString`?
【发布时间】:2013-01-04 15:42:31
【问题描述】:

我相信所有全局变量都可以从全局对象访问。因此,如果我可以访问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.toStringtoString 绑定到 Firefox 的控制台是什么?控制台中还有哪些其他全局值不同?

【问题讨论】:

  • cannot reproduce。我错过了什么?
  • 请参阅下面我的回复中的 cmets,显然您看到的是 Firebug 问题。
  • @Travis 我已更改示例以避免与 Firebug 问题混淆。
  • 在控制台中尝试toString === console.toString

标签: javascript console global-variables firebug


【解决方案1】:

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

一个实际的全局变量总是window 对象上可用。

【讨论】:

  • 即,全局对象(窗口)实际上没有属性“toString”,它的原型有。 window.hasOwnProperty('toString') === false
  • 我认为作者是指您可以在控制台window.toString === toString 中执行并获取false 的事实。
  • 好的,所以它不是全局变量,但它在全局命名空间中可用。全局命名空间中还有哪些不是window 的属性?什么定义了进入全局命名空间的内容?
  • @WilfredHughes,我想你误会了。全局所有内容都将在窗口中显示,但并非所有通过窗口可用的内容都将在全局范围内可用。
【解决方案2】:

也许这与this question有关? 这一切都与上下文有关,我相信

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

但是

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我可以在 FF 17.0.1 中重现这个。也许您有旧版本?
    • 确实,我 15 岁。显示了我现在使用 Firefox 的频率。但是,即使更新后,我仍然看到相同的结果。我正在使用this fiddle
    • 非常很有趣,因为当我直接进入 firebug 控制台时,它会给我 OP 描述的结果。为什么 jsfiddle 和 firebug 控制台会产生不同的结果?
    • 这很有趣。也许它是在提供toString 函数的范围内从控制台执行代码。抱歉,我不是 Firebug 人,所以我真的不知道。
    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2017-04-17
    • 1970-01-01
    相关资源
    最近更新 更多