Структура кода и строгий режим

Структура кода и строгий режим в JavaScript #

Программа на JavaScript состоит из инструкций (statements), которые движок выполняет сверху вниз. Понятная структура кода снижает число скрытых ошибок; режим "use strict" отключает опасные устаревшие послабления языка.


Инструкции и блоки #

Инструкция — законченное действие: объявление, присваивание, вызов, условие, цикл.

const queueSize = 3
const label = 'intake'

console.log(label, queueSize)

Блок { ... } группирует инструкции. У let / const внутри блока своя область видимости:

{
  const step = 'validate'
  // step виден только здесь
}

// console.log(step) // ReferenceError

Блоки используют в if, циклах, try/catch и просто для ограничения области переменных.


Точки с запятой #

JavaScript умеет вставлять ; автоматически (ASI — Automatic Semicolon Insertion), но правила неочевидны. Безопасная практика для учебного и продакшен-кода — ставить ; явно или использовать единый стиль линтера.

Классическая ловушка без точки с запятой:

const createRankBroken = () => {
  return
  {
    level: 1
  }
}
// функция вернёт undefined: return «закрылся» до объекта

Правильно:

const createRank = () => {
  return {
    level: 1,
  }
}

Ещё один риск — строка, начинающаяся с [ или ( сразу после выражения без ;.


Комментарии #

// однострочный: зачем сделано решение, а не «что очевидно из кода»

/*
  многострочный:
  контракт функции, ограничения входных данных
*/

/**
 * Считает среднее по баллам спринта.
 * Пустой массив → null.
 */
function averageScore(values) {
  if (values.length === 0) return null
  const sum = values.reduce((acc, n) => acc + n, 0)
  return sum / values.length
}

Комментарии дополняют имена переменных, а не дублируют их: i++ // увеличить i — шум.


Строгий режим: "use strict" #

Строгий режим запрещает часть неявного поведения ES5 и раньше. В ES-модулях и в классах strict включается автоматически. В обычных скриптах добавьте директиву первой строкой файла или функции:

'use strict'

function registerUser(login) {
  // accidentalGlobal = login // ReferenceError в strict
  const safeLogin = login.trim()
  return safeLogin
}

Что меняется на практике:

Без strict (упрощённо)Со strict
Присвоение несуществующей переменной создаёт глобалReferenceError
delete у обычной переменной молча «не срабатывает»ошибка
Дубликаты имён параметров допустимызапрещены
this у вызова функции без объекта → глобальный объектthis === undefined
'use strict'

function readContext() {
  return this
}

readContext() // undefined, а не window/globalThis

Для нового кода ориентируйтесь на модули (type="module" / import/export) — strict уже «встроен».


Именование и читаемость #

  • Имена отражают смысл: retryCount, не x2.
  • Однотипный стиль: camelCase для переменных и функций.
  • Функции — глаголы (fetchFeed), булевы флаги — предикаты (isReady, hasToken).
const maxRetries = 3
let attempt = 0

function canRetry(attempt, maxRetries) {
  return attempt < maxRetries
}

Итог #

  • Код — последовательность инструкций и блоков с локальной видимостью.
  • Явные ; и дисциплина ASI убирают редкие, но дорогие баги.
  • "use strict" (или модули) ловит случайные глобалы и странный this.
  • Комментарии объясняют намерение; имена объясняют данные.

См. также #

Часто спрашивают

Чем let отличается от const?
Оба блочные. let допускает повторное присваивание, const — нет (содержимое объекта при этом можно менять). Подробнее
Зачем нужен use strict?
Строгий режим ловит случайные глобалы и делает this у «голых» вызовов равным undefined; в ES-модулях он включён по умолчанию. Подробнее
Почему лучше писать ===, а не ==?
=== не приводит типы молча; == запускает сложные правила приведения и чаще даёт неожиданный результат. Подробнее