ES6中的范围混乱

时间:2018-03-07 09:33:08

标签: javascript ecmascript-6

let cards = ['Diamond', 'Spade', 'Heart', 'Club'];

let currentCard = 'Heart';

while (currentCard !== 'Spade') {
  console.log(currentCard);
  let currentCard = cards[Math.floor(Math.random() *4)];
}

console.log(currentCard);

这里我关注的是currentCard没有定义的错误,即使我已经全局声明了它。

所以我认为不应该出现错误消息currentCard is not defined

3 个答案:

答案 0 :(得分:1)

这是因为您已在全局范围和let循环中使用while定义了变量。 let的作用域是块作用域,因此在while循环中的内容与全局作用域不同。

它正在第6行崩溃,console.log正好在while定义之下。您可以在console.log下方的行中的while循环中定义变量。因此,Javascript找不到您的变量,因为它尚未定义。

来自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

  

let声明的变量的范围是定义它们的块,以及任何包含的子块。这样,让我的工作非常像var。主要区别在于var变量的范围是整个封闭函数

答案 1 :(得分:0)

您正在while循环中重新定义currentCard。删除额外的让它应该工作。

答案 2 :(得分:0)

您的错误来自while阻止console声明。

  

所以我认为没有定义错误消息currentCard   不应该来。

,即使您已全局声明currentCard,您已在while循环块中重新声明了它,并且在初始化之前访问了它相同即可。

详细了解temporal dead zone