Блочная область видимости

«Область видимости — часть программы, в которой доступна переменная.»

Почему var нежелателен (4 проблемы)

// 1. Допускает повторное объявление
var x = 1
var x = 2  // ОК — запутывает!

// 2. Игнорирует блоки
if (true) { var leaked = 1 }
console.log(leaked) // 1 — утекла из блока!

// 3. Hoisting — доступна до объявления
console.log(y)  // undefined (не ошибка!)
var y = 5

// 4. Только функциональная область видимости

let и const (ES6)

// Блочная область видимости
if (true) {
  let blockVar = 'внутри'
  const blockConst = 'тоже внутри'
}
// console.log(blockVar) // ReferenceError!

// Нет hoisting
// console.log(b)  // ReferenceError
let b = 5

// Нет повторного объявления
let c = 1
// let c = 2  // SyntaxError

Глобальная vs локальная область видимости

const global = 'я глобальная'

function example() {
  const local = 'я локальная'
  console.log(global) // доступна
  console.log(local)  // доступна
}

console.log(global) // доступна
// console.log(local) // ReferenceError