varのデメリット

  1. 同一スコープで同一名の変数を宣言できる
  2. 変数の巻き上げによる上書き

1. 同一スコープで同一名の変数を宣言できる

OK

var x = 10;
var x = 20; // OK

let は NG

let y = 10;
let y = 20;  // SyntaxError: Identifier 'y' has already been declared

const は NG

const z = 10;
const z = 20;  // Syntax Error Identifier 'z' has already been declared

2. 変数の巻き上げによる上書き

関数内部でグローバルスコープと同一の変数名を定義すると、 関数内部において、変数が巻き上げられて使用される。

var x = 10;
function test () {
     console.log(x) // 20
     x = 20
}

console.log(x) // 10