【问题标题】:JavaScript variable without var inside function not available in Global Execution Context [duplicate]全局执行上下文中没有函数内部没有 var 的 JavaScript 变量 [重复]
【发布时间】:2019-07-22 09:09:38
【问题描述】:

我在 kyle simpson 的一门 javascript 课程中了解到,如果我们在 Javascript 函数中声明一个没有任何前缀 var 关键字的变量,那么该变量在全局执行上下文中可用,但是当我在 chrome 开发人员工具或nodejs 它抛出 ReferenceError:....

有什么变化吗?

在 Windows 和 Linux 上的 Firefox 和 Chrome 中发生。

function foo() {
  bar = "I am in global scope";
}
foo();
console.log(bar);


    

ReferenceError: bar 未定义

另一个问题是关于未定义被附加到输出日志,我在这个问题中没有提到它。不知道为什么这被标记为重复。这个问题是关于全局执行上下文/范围

谢谢。

【问题讨论】:

  • 我无法重现该问题 — i.imgur.com/HkiUumO.png — 但不要这样做。隐式全局变量很糟糕(在严格模式下被禁止,始终使用严格模式)。
  • 该问题在 Chrome 开发工具中重现。但不是真的在sn-p中。无论如何,您根本不应该这样做
  • 它应该同时在客户端和服务器中进行控制台,但无论如何这都是不好的做法
  • “有什么变化吗?” 不是松散模式,不会,也不会。 JavaScript 的指导委员会 TC39 非常正确地非常意识到向后兼容性。在严格模式下,该代码会失败,因为 bar 在您分配给它的位置未声明。
  • 我明白这不是一个好习惯,我们应该有严格模式。但只是想验证凯尔在会议上所说的话。我正在使用 node 命令和 chrome 控制台在终端中运行它

标签: javascript google-chrome google-chrome-devtools strict-mode


【解决方案1】:

有什么变化吗?

不是松散模式,不会,也不会。 JavaScript 的指导委员会 TC39 非常正确地非常意识到向后兼容性。

在严格模式下,该代码会失败,因为 bar 在您分配给它的位置未声明。

您说过您在 Chrome 的控制台和 Node.js 的 REPL 中都看到了这一点。我在这两种情况下都看到了undefined,但这是因为这些环境显示了调用console.log(即undefined之后显示bar 的结果。我先看到"I am in global scope",然后看到undefined(调用console.log的结果):

也就是说,不要将控制台用于此类事情。 :-) 控制台是一个非常特殊的环境,尤其是在范围内,因为它们具有交互性。如果您想知道某些东西是如何工作的,甚至与范围相关,最好将其复制到实际的文件或脚本中,而不是控制台。

【讨论】:

  • 这似乎表明 Chrome 开发工具确实从草率模式变为严格模式?它在 Chrome 75.0.3770.142 中确实可以正常工作。
  • 正确,我的是 Chrome 55.0.2883.87
  • @Bergi - 不,据我所知,控制台不会切换到严格模式。我以为 OP 看到了 undefined 而没有看到 "I am in global scope",我狡猾的眼睛也让我在 Chrome 控制台中错过了它。但我认为他们只是缺少"I am in global scope" 输出。
  • @finepax007 - 见上文,并编辑了答案。
  • @T.J.克劳德,我希望我能 :),自过去几个月以来,我的帮助台升级 chrome 的票仍处于待处理状态 :)
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 2012-10-31
  • 1970-01-01
  • 2015-08-30
  • 2020-04-04
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多