varとはletの登場以前から使われてきた宣言方法で使い方は基本的にはletと同じですがいくつか大きく違う点があります。そのうちの一つが”ブロックスコープ”です。
letやconstのスコープはブロックスコープと呼ばれるもので、{}で囲んだ部分が変数の有効範囲となります。
例えば、if文の中でname変数を宣言します(中身はカエル)。そのname変数をif文のブロックスコープの外で呼び出そうとしてもエラーになります。
if (true){//ブロック
let name = "カエル";
console.log(name) //カエル
}//ここまでがブロックスコープ
console.log(name) //スコーの外で呼び出す
実行結果↓

一つ目のカエルは表示されてますが、2つ目は空欄になっています。
ブロックスコープが発生しているため、外からnameを参照することができません。
ちなみにここまでのレッスンを同じコンソールで実行してきた方は、空欄ではなくオタマジャクシが表示されるかもしれません。それは、「03.constとは」で宣言したnameを呼び出しているからです。つまり、ブロックスコープ内のname(カエル)とブロックスコープ外のname(オタマジャクシ)の両方を呼び出してる形になります。
一方、varではブロックスコープは作れませんので、全てどこからでも再代入可能という事になります。
1位 const 再宣言NG、再代入NG、ブロックスコープ有
2位 let 再宣言NG、再代入OK、ブロックスコープ有
3位 var 再宣言OK、再代入OK、ブロックスコープ無