Javascript 使用var进行重新声明是可行的,但不适用于let-in-Chrome代码段

Javascript 使用var进行重新声明是可行的,但不适用于let-in-Chrome代码段,javascript,ecmascript-6,let,executioncontext,Javascript,Ecmascript 6,Let,Executioncontext,我开始学习JavaScript,并在Google Chrome中使用代码片段或控制台。我不明白一件事。 当我像这样运行代码段时: let x = 5; console.log(x); 多次。一切正常,但当我第一次运行时: var x = 5; console.log(x); 然后我将代码更改为使用let: let x = 5; console.log(x); 我得到错误SyntaxError:标识符“x”已经声明了,我不明白为什么。 我假设用let声明的变量在某种程度上是“易失的”,但用v

我开始学习JavaScript,并在Google Chrome中使用代码片段或控制台。我不明白一件事。 当我像这样运行代码段时:

let x = 5;
console.log(x);
多次。一切正常,但当我第一次运行时:

var x = 5;
console.log(x);
然后我将代码更改为使用let:

let x = 5;
console.log(x);
我得到错误
SyntaxError:标识符“x”已经声明了,我不明白为什么。
我假设用let声明的变量在某种程度上是“易失的”,但用var声明的变量与窗口对象关联,所以它们是“非易失的”?
或者更一般地说:全局环境的声明性环境记录中的声明是否在脚本执行后被清除,而存储在全局环境的对象环境记录中的声明是否被清除?

当我在Google Chrome Snippets/Console中多次运行snippet时,它是在相同的执行上下文中运行,还是每次按下run按钮时都在新的全局环境中重新创建?

您使用的是哪个Chrome版本?在浏览器控制台中。但请记住,这只是出于测试目的而存在的。真正的JavaScript引擎(Node.js、除DevTools之外的Chrome等)仍然会抛出错误


可以重新声明var是正常的,因为它的作用域不同。这是let添加ES6的原因之一。您可以阅读有关var与let的更多信息。

忽略同一范围内相同
var
变量的多个声明。
let
(以及
const
)的情况并非如此,因为同一范围内的多个声明不会被忽略,从而导致第二个声明失败

考虑以下几点:

var x = 1;
var x = 2;
let x = 1;
let x = 2;
以及以下各项:

var x = 1;
var x = 2;
let x = 1;
let x = 2;
在第一个示例中,解释器将代码视为:

var x;
x = 1;
x = 2;
秒示例保持不变,因为有
let
关键字

虽然所有变量在技术上都已提升,但它们的评估结果并不相同。 发件人:

var语句声明作用域为运行对象的变量 执行上下文的可变环境。Var变量被创建 当它们的包含词汇的环境被实例化并且 创建时已初始化为未定义

语义
var
声明在实例化其上下文后进行评估。
let
但是,只有在到达代码中的声明后,才会对其求值。

您可以将所有代码都用括号括起来

{
let x = 5;
console.log(x);
}
JavaScript允许您将任何代码包装在括号中。
每次运行代码段时,括号将为let变量创建一个唯一的作用域。

这是因为当您执行
let x=5
时,无法再次重新声明变量(因为您必须执行多次),即稍后执行
let x=…
。相反,您需要重新分配它的值,即,
x=…
@Terry实际上,如果我只对声明使用let,我可以毫无问题地运行脚本。只有当我第一次使用var,然后将其更改为let时,问题才会出现。这些示例是完整的-它们是两行代码。代码中没有重新声明。@swch如果您多次编写
让x=5
并运行代码,它将无法工作。这是Chrome(V8)控制台的一些特定优化。Firefox控制台抛出一个错误。当您将代码复制到控制台时,请将其包装到。这样,当你多次复制它时,你就不必担心重新声明了。
let
const
变量也被提升了:虽然这是一个技术性问题,而且在一天结束时,我们不会像被提升一样对其进行评估,我编辑了我的回复以更好地解释这一点。Chrome 83,正如我提到的,在只允许的地方运行脚本没有问题。问题是,当在某些脚本中存在var时,我将其更改为letThank,这澄清了我对这种奇怪行为的看法。。。你知道我们能否禁用它吗?