【问题标题】:Default scope in Firefox web console - what's going on?Firefox Web 控制台中的默认范围 - 发生了什么?
【发布时间】:2013-03-19 11:18:21
【问题描述】:

在我尝试过的其他浏览器(例如 Chromium、IE、Safari)中,在控制台(在任何函数之外)执行的代码的默认范围与在 @987654322 中的函数之外执行的代码相同@。也就是说,this 指的是window 对象,并且任何新声明的变量都成为全局变量(以及,等效地,window 对象的属性)。

在 Firefox 中...发生了其他事情,但我不太清楚是什么。在大多数浏览器中,this === window 在 Chrome 控制台中的计算结果为 true,但在 Firefox 中它是错误的。不过,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 版本。)

【问题讨论】:

  • 听起来像是在另一个范围内运行。您所看到的正是原型继承的工作原理。 (看起来您正在看到一个原型为 foo 的对象)。 (我刚找到的相关问题stackoverflow.com/questions/1803660/…
  • 尝试在控制台中运行debugger;
  • 我在用手机,所以我无法获得链接,但谷歌“kangax delete”你应该得到这个奇怪行为的解释。

标签: javascript firefox console scope


【解决方案1】:

您遇到的情况是因为 Firefox Web 控制台在沙箱中评估语句。

Here is an open bug about it 在 bugzilla 中

输入到 Web 控制台和 Scratchpad 的表达式在一个沙盒全局中进行评估,其原型是内容窗口:this.__proto__ === window

这有一些很好的效果:在 Scratchpad 中声明的变量实际上是该暂存器的本地变量,而不是污染内容的全局;你可以到处玩。如果确实想创建一个对内容可见的全局变量,总是可以简单地在 window 上创建一个属性:'window.newGlobal = "fruit"'。

但是,我怀疑这实际上没有帮助。对于开发人员来说,最简单的思维模型是让在 Web 控制台/暂存器中输入的代码像元素的内容一样被评估。解释为什么 'x' 显示内容的 x 但 'x = 5' 并没有改变它(但 'x.y = 5' 对内容可见!)涉及一定程度的细节,只有更多参与的开发人员有兴趣。

提供内容中不存在的实用功能当然很有价值;但这可以通过评估“with”表达式范围内的表达式来完成,该表达式应用于以实用程序函数作为其属性的对象。 'With' 不是我最喜欢的构造,但由于我们完全控制了对象的属性,所以通常使用 'with' 的缺点并不适用;一旦您决定引入一些仅限 Web 控制台的功能,“with”的行为就是您所需要的。 (不要忘记以下内容会在全局上为 x 和 y 创建绑定:

with (o) { var x = 5; y = 6; }

所以“with”并没有重新引入我上面提到的沙盒问题。)

关于这是如何工作的。在 JavaScript 中,继承是原型的。沙盒是一个对象,其 prototype 是窗口而不是窗口本身。 Here is a tutorial about it 在 MDN 中。

【讨论】:

  • 很好——你不仅在网上跟踪了一些我失败的问题的讨论,而且它是有用的、有趣的讨论,可以解释这种行为。谢谢。
  • 不客气。我只想提一下,这个问题在萤火虫中不存在。随意浏览我关于原型链的其他一些答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多