【问题标题】:About var/const, why this code will work?关于 var/const,为什么这段代码会起作用?
【发布时间】:2017-05-13 11:00:26
【问题描述】:

打开开发控制台(或在node.js中),依次输入以下代码:

a = 1
var a = 2
const a = 3

如您所见,它可以工作,但是如果您一次输入所有代码,则会出现错误,我认为这更合理

我猜唯一的区别是提升,如果你一次输入所有代码,它将被视为:

var a
a = 1
a = 2
const a = 3

但是我不明白为什么当你逐行输入时它会起作用,而且如果你跳过第一行,你会得到一个预期的错误

【问题讨论】:

  • 有趣的行为!您可能会暴露控制台环境的一些特定行为。
  • @AndyRay 我在 node.js 和不同的浏览器中尝试过,我得到了相同的结果
  • 我可以想象在第一种情况下 var 实际上被忽略了,因为全局对象上已经有一个名为 a 的属性(因为 a = 1)。因此,实际上没有任何信息表明 var a 已被声明。正如您在第二种情况下指出的那样,var a 被提升,因此在a = 1 发生之前处理,因此它不会被忽略。但这是猜测,控制台/REPL 环境可能会做一些奇怪的事情。
  • 不管怎样,我的 FF 确实会抛出重新声明错误,即使逐行传递也是如此。 (铬错误?)

标签: javascript ecmascript-6


【解决方案1】:

在环境的全局范围内,变量可以被分配和声明而与类型无关,因此当您按顺序输入以下代码时,它会起作用。

z = 1
var z = 2
const z = 3

z 的值现在是 3

现在假设我们一次执行所有这些

    z = 4;  var z = 5;  const z = 6;

z 的值仍然是 3

在这种情况下,解释器会抛出错误,因为在这里它会尝试将上述所有语句作为一个块执行一次,现在它已经找到了 'z' 的多个声明,因此会为整个块抛出一个错误,并且不会甚至执行第一部分,即z = 4;

一次性执行所有内容的语句相当于

(function foo(){ z = 4; var z = 5; const z = 6;  })();

【讨论】:

  • 你可以注意到一件事..如果我们使用开发工具定义变量'a',它会附加到窗口对象,如果你添加'const a',它不会添加到窗口对象,例如变量 a = 2;您将 find window.a 值填写为 2 并输入 const a = 3;你仍然注意到 window.a 值保持不变意味着 2.
  • 因此,基本上,如果将所有内容放在一个块范围内,并且 const z 不能更改,则其他任何内容都无效。但是如果 z 在单独的行上声明,每一行都被认为是它自己的范围,所以 const 值不适用于它们?
猜你喜欢
  • 2017-08-22
  • 2017-05-24
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多