Javascript中的let变量会发生什么变化?

Javascript中的let变量会发生什么变化?,javascript,ecmascript-6,Javascript,Ecmascript 6,我执行了以下代码,发现我无法在全局范围内始终访问变量 console.log(b); let b = 1; VM12265:1 Uncaught ReferenceError: b is not defined at <anonymous>:1:13 (anonymous) @ VM12265:1 let b = 1; console.log(b); VM12318:1 Uncaught SyntaxError: Identifier 'b' has already bee

我执行了以下代码,发现我无法在全局范围内始终访问变量

 console.log(b); let b = 1;
VM12265:1 Uncaught ReferenceError: b is not defined
    at <anonymous>:1:13
(anonymous) @ VM12265:1
let b = 1; console.log(b);
VM12318:1 Uncaught SyntaxError: Identifier 'b' has already been declared
    at <anonymous>:1:1
(anonymous) @ VM12318:1
console.log(b);
VM12368:1 Uncaught ReferenceError: b is not defined
    at <anonymous>:1:13
console.log(b);设b=1;
VM12265:1未捕获引用错误:未定义b
时间:1:13
(匿名)@VM12265:1
设b=1;控制台日志(b);
VM12318:1未捕获的语法错误:标识符“b”已声明
时间:1:1
(匿名)@VM12318:1
控制台日志(b);
VM12368:1未捕获引用错误:未定义b
时间:1:13

我想知道在执行步骤1和步骤2后,步骤3中的变量b发生了什么情况。

我已经检查了这两种情况,它对我有效

let b = 1;
var b1 = 2;
console.log(b);
console.log(b1);

对于第一个

控制台日志(b);设b=1;VM12265:1未捕获引用错误:b为 未定义 at:1:13(匿名)@VM12265:1

Let
绑定在初始化之前不会创建,因此不会创建引用。您访问了中的值


设b=1;控制台日志(b);VM12318:1未捕获的语法错误:标识符 “b”已被声明 at:1:1(匿名)@VM12318:1

对于第二个,如消息所示,b已经被声明。依照

如果BindingList的BoundNames包含任何 重复条目


您尚未声明变量
b

2种方式:

  • 使用
    var
    而不是
    let
    (这是因为JS吊装)

  • 先声明
    b
    然后再使用


  • let
    不为全局范围定义变量。您可以在块范围的开头声明
    let
    变量一次,并将变量设置为新值,而无需多次尝试使用
    let
    重新声明变量以避免错误

    {
    让b;
    试一试{
    控制台日志(b);
    b=1;
    控制台日志(b);
    b=2;
    }捕捉(错误){
    控制台错误(错误消息)
    }
    控制台日志(b);
    
    }
    不定义全局范围的变量。第二个和第三个变量是在同一个会话中完成的吗?这就是我想要的。谢谢分享@gurvinder372类似的参考。我想要的是步骤3的谜语,而不是步骤1