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