现在这根本没有实际意义,但我很好奇这个我偶然发现的小怪癖。
基本上,在Chrome的开发者控制台中,这个
toString()
返回[object Object]
,而这
this.toString()
返回[object DOMWindow]
。
据我所知,这只发生在控制台上,可以看到on this jsFiddle。有人在## javascript上找到this link解释函数的来源。但是,它并未解释在控制台内部或外部使用时的行为差异。
那么为什么toString()
和this.toString()
会在Chrome控制台中产生不同的结果呢?
WebKit碰巧在控制台中使用错误的上下文进行全局调用。
(Chrome 14):
> this
DOMWindow
> this.toString()
"[object DOMWindow]"
> toString()
"[object Object]"
> valueOf()
CommandLineAPI
我认为这已经修复了here
Live example显示大多数是"[object Window]"
这个bug主要适用于控制台。请注意,Object.prototype.toString.call(window)
仍然返回全局
var s = toString;
console.log(s()); // "[object global]"
console.log(toString()); // "[object Object]"
console.log(window.toString()); // "[object Window]"
(function () {
var s = toString;
console.log(s()); // "[object Undefined]"
})();
(function () {
var s = window.toString;
console.log(s()); // "[object Window]"
})();
console.log(Object.prototype.toString.call(window)); // "[object global]"
console.log(window.toString.call(window)); // "[object DOMWindow]"
你发现了一包未定义的行为。我建议你逃跑。
部分结果可以解释为全局上下文和窗口对象可能不是同一个东西(大提示是[对象全局])。
注意this === window
在所有5个案例中。
请注意,window.toString === Object.prototype.toString; // false
解释了很多这方面的内容。似乎window.toString
是一个特殊的(但不同的)功能
Object
的信息,通过该对象,toString()函数被拥有并且所有内容都继承自:.toString()
的this
函数,在这种情况下是窗口对象:在我得到这个答案的-20之前,它是基于输出[object Object]
的推论(所以我不确定):对我来说它告诉该方法是从Object
执行的。
如果你在Firebug中做同样的事情,它实际上是从window
对象执行的:
我想这个特定于控制台的实现...或Chrome版本中的错误。