关于var/const,为什么这段代码会起作用?

Cod*_*Cat 9 javascript ecmascript-6

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

a = 1
var a = 2
const a = 3
Run Code Online (Sandbox Code Playgroud)

screenshot1

正如您所看到的那样,但如果您一次输入所有代码,您将收到错误,我认为这更合理 screenshot2

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

var a
a = 1
a = 2
const a = 3
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

小智 1

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

z = 1
var z = 2
const z = 3
Run Code Online (Sandbox Code Playgroud)

现在 z 的值为 3

现在假设我们立即执行所有这些

    z = 4;  var z = 5;  const z = 6;
Run Code Online (Sandbox Code Playgroud)

z 的值仍然是 3

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

立即执行所有内容的语句相当于

(function foo(){ z = 4; var z = 5; const z = 6;  })();
Run Code Online (Sandbox Code Playgroud)

  • 你可以注意到一件事..如果我们使用开发工具定义变量“a”,它会附加到窗口对象,如果添加“const a”,它不会添加到窗口对象,例如 var a = 2; 将 find window.a 值填为 2,然后输入 const a = 3; 你仍然注意到 window.a 值保持不变意味着 2。 (2认同)