在我尝试过的其他浏览器(例如 Chromium、IE、Safari)中,在控制台(在任何函数之外)执行的代码的默认范围与在<script>
. 也就是说,this
引用window
对象,并且任何新声明的变量都成为全局变量(以及,等效地,window
对象的属性)。
在 Firefox 中……发生了其他事情,但我不太清楚是什么。在大多数浏览器中,在 Chrome 控制台中this === window
计算结果为true
,但在 Firefox 中为 false。this.window === window
不过,在 Firefox 中是正确的。因此,通过控制台新声明或分配的变量不会对页面上运行的脚本可见,除非您将它们window
明确分配为对象的属性。
古怪并不止于此。对window
对象的赋值会神奇地向上传播并修改 Firefox 控制台范围内的变量,但反之则不然。例子:
window.foo = 5;
console.log(foo); // 5
console.log(this.foo); // 5
console.log(window.foo); // 5
foo = 10;
console.log(foo); // 10
console.log(this.foo); // 10
console.log(window.foo); // 5 -- in any other browser, this would be 10
幕后发生了什么?Firefox中所指的神秘物体是什么this
,为什么它与该window
物体有这种奇特的关系?这些东西在任何地方都有记录吗?
(以防万一,我在 Firefox 19.0.2 中体验过这些东西。我还没有测试过其他 Firefox 版本。)