Learning Book

Строгий режим и современный JS

Зачем нужен строгий режим

JavaScript создавался быстро, с ошибками в дизайне. Некоторые «особенности» языка — настоящие ловушки для разработчиков. В ES5 (2009) добавили строгий режим (use strict), который запрещает самые опасные конструкции.

Включить строгий режим просто — добавь строку в начало файла или функции:

'use strict'

// Теперь эти ошибки будут выброшены явно, а не молча проигнорированы
x = 10 // ReferenceError: x is not defined (без strict — создала бы глобальную переменную!)

Что запрещает strict mode

'use strict'

// 1. Нельзя использовать необъявленные переменные
mistake = 42 // ❌ ReferenceError

// 2. Нельзя удалять переменные и функции
let obj = {}
delete obj // ❌ SyntaxError

// 3. Дублирующиеся параметры функции
function f(a, a) { } // ❌ SyntaxError

// 4. this в обычных функциях — undefined (не window)
function showThis() {
  console.log(this) // undefined, а не window
}
showThis()

// 5. Зарезервированные слова нельзя использовать как имена
let implements = 1 // ❌ SyntaxError
**ES-модули** (файлы с import/export) автоматически используют строгий режим — писать 'use strict' не нужно. Если ты используешь сборщик (Vite, webpack) — скорее всего, strict уже включён.

ES6+ — современный JavaScript

В 2015 году вышел ES6 (ES2015) — самое большое обновление языка за всю историю. С тех пор версии выходят ежегодно.

Вот что появилось в ES6+ и используется каждый день:

// ES6: let и const вместо var
let count = 0
const PI = 3.14159

// ES6: стрелочные функции
const double = x => x * 2

// ES6: шаблонные литералы
const name = 'Иван'
console.log(`Привет, ${name}!`) // Привет, Иван!

// ES6: деструктуризация
const [first, ...rest] = [1, 2, 3]  // first = 1, rest = [2, 3]
const { title, author } = book       // извлечь поля объекта

// ES6: классы (синтаксический сахар над прототипами)
class Animal {
  constructor(name) {
    this.name = name
  }
  speak() {
    return `${this.name} издаёт звук`
  }
}

// ES2017: async/await
async function fetchUser(id) {
  const response = await fetch(`/api/users/${id}`)
  return response.json()
}

// ES2020: optional chaining и nullish coalescing
const city = user?.address?.city ?? 'Неизвестно'

Как проверить поддержку

Не все браузеры поддерживают новые фичи одинаково. Проверить поддержку можно на caniuse.com или MDN.

Для совместимости используют транспайлеры (Babel, TypeScript) — они преобразуют современный JS в ES5, который понимают старые браузеры.

// Ты пишешь (ES2020):
const value = obj?.nested?.value ?? 'default'

// Babel преобразует в (ES5):
var _obj, _obj2
var value = (_obj = obj) === null || _obj === void 0
  ? void 0
  : (_obj2 = _obj.nested) === null || _obj2 === void 0
    ? void 0
    : _obj2.value
value = value !== null && value !== void 0 ? value : 'default'
В этой книге мы используем **ES2020+** и TypeScript. Если видишь ??, ?., async/await — это уже хорошо поддерживается во всех современных браузерах.