Строгий режим JavaScript (strict mode) меняет поведение
интерпретатора, устраняя часть исторических особенностей языка и
превращая многие потенциальные ошибки в исключения. В экосистеме ESLint
строгий режим рассматривается как обязательная часть базовой гигиены
кода, однако его реализация отличается от ранних версий линтера и тесно
связана с модульной системой ECMAScript.
В современном JavaScript строгий режим включается либо директивой
"use strict", либо автоматически в модулях ES
(import / export). ESLint не является
исполнителем кода, поэтому он не «включает» строгий режим напрямую, а
проверяет корректность его применения и предотвращает использование
конструкций, несовместимых с ним.
Ранее ESLint включал правило strict, которое
контролировало наличие директивы строгого режима в файлах и функциях.
Оно поддерживало несколько режимов:
safe — требовал строгий режим только в ES5-кодеglobal — требовал "use strict" в верхнем
уровне файловfunction — требовал директиву в каждой функцииСо временем это правило утратило актуальность. Причина заключается в том, что:
В результате правило strict было признано устаревшим и
больше не используется в новых конфигурациях ESLint.
ESLint учитывает важную особенность языка: любой файл, объявленный как ES-модуль, автоматически интерпретируется в строгом режиме.
К таким файлам относятся:
import / export"type": "module" в
package.jsonЭто означает, что в подобных файлах:
withthis в верхнем контексте не привязан к глобальному
объектуESLint не требует дополнительной конфигурации для включения строгого режима в таких случаях, но продолжает анализировать код на предмет нарушений строгих ограничений через отдельные правила.
Вместо управления директивой строгого режима современный ESLint использует набор правил, которые отражают его ограничения.
Запрещает использование eval, которое в строгом режиме
становится более ограниченным и потенциально опасным.
Ключевые особенности:
Запрещает неявные формы eval, включая:
setTimeout("code")setInterval("code")new Function("code")В строгом режиме подобные конструкции ведут себя непредсказуемо и ухудшают оптимизацию.
Запрещает доступ к arguments.callee и
arguments.caller, которые:
Хотя эти правила не являются прямыми следствиями строгого режима, они логически продолжают его идею: устранение неявного поведения и глобальных побочных эффектов.
Строгий режим влияет не только на синтаксис, но и на семантику выполнения кода. ESLint учитывает это через статические проверки.
В строгом режиме присваивание несуществующей переменной вызывает ошибку. ESLint реализует это через:
no-undefno-global-assignЭти правила предотвращают создание глобальных переменных без объявления.
function sum(a, a, b) {}
В строгом режиме такая функция вызывает исключение. ESLint фиксирует это через:
no-dupe-args (встроенная проверка parser’а)В строгом режиме значение this в обычных функциях равно
undefined, если вызов не привязан явно.
ESLint не проверяет значение this напрямую, но помогает
выявлять проблемные места через:
no-invalid-thisfunc-namesconsistent-thisСовременные конфигурации ESLint используют parserOptions
для описания версии ECMAScript и типа модулей:
export default {
parserOptions: {
ecmaVersion: 2022,
sourceType: "module"
}
}
При таком описании:
strict не требуетсяРазличные среды накладывают дополнительные ограничения:
cjs и
esm"use strict" влияет на поведение всех функций
внутри файлаenv настройкиexport default {
env: {
browser: true,
es2021: true
}
}
value = 10;
В строгом режиме это приводит к ошибке. ESLint предотвращает это
через no-undef.
delete x;
В строгом режиме запрещено удалять переменные. ESLint фиксирует
подобные конструкции через no-delete-var.
const obj = {
a: 1,
a: 2
};
Строгий режим не допускает такие случаи, ESLint проверяет через
no-dupe-keys.
Современный подход к строгому режиму заключается не в управлении директивой, а в использовании набора правил, моделирующих его поведение. Конфигурации обычно включают:
eslint:recommendedПример конфигурационного слоя:
export default {
rules: {
"no-undef": "error",
"no-eval": "error",
"no-implied-eval": "error",
"no-caller": "error",
"no-dupe-keys": "error"
}
}
Такой набор формирует поведение, эквивалентное строгому режиму, но на уровне статического анализа, а не исполнения.
Со временем строгий режим перестал быть отдельной сущностью в конфигурациях ESLint. Его функции распределились между:
Это позволило устранить дублирование проверок и сосредоточить
внимание на конкретных классах ошибок, а не на декларативной директиве
"use strict".