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

时间:2018-01-12 06:25:10

标签: 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 been declared
    at <anonymous>:1:1
(anonymous) @ VM12318:1
console.log(b);
VM12368:1 Uncaught ReferenceError: b is not defined
    at <anonymous>:1:13

我想知道在执行第1步和第2步后第3步中变量b发生了什么。

4 个答案:

答案 0 :(得分:2)

对于第一个

  

的console.log(B);设b = 1; VM12265:1未捕获的ReferenceError:b是   没有定义的       at:1:13(匿名)@ VM12265:1

Let 绑定在初始化之前不会创建,因此不会创建任何引用。您访问了temporal zone

中的值
  

设b = 1;的console.log(b)中; VM12318:1未捕获的SyntaxError:标识符   &#39; B&#39;已经宣布       at:1:1(匿名)@ VM12318:1

对于第二个,如消息所示, b已经声明。根据{{​​3}}

  

如果BindingList的 BoundNames包含any,则为语法错误   重复条目

答案 1 :(得分:1)

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

&#13;
&#13;
{
  let b;

  try {
    console.log(b);
    b = 1;
    console.log(b);
    b = 2;
  } catch (err) {
    console.error(err.message)
  }
  console.log(b);
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您尚未声明变量b

2种方式:

  1. 使用var代替let(这是因为JS吊装)

  2. 首先声明b然后在

  3. 之后使用它

答案 3 :(得分:-1)

我已经检查了它为我工作的两种情况。你可以在你写的地方分享完成你的代码吗?

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