Что такое директива 'use strict' в JavaScript и как она влияет на код
Что проверяют
Понимаете ли вы, что в языке два режима исполнения, и знаете ли, где строгий включается сам. Сегодня это заодно вопрос про возраст ваших знаний: во фронтенде почти весь код и так строгий, и важно объяснить, почему директиву всё ещё встречают в проектах.
Как отвечать
Строгий режим убирает исторические послабления. Присваивание необъявленной переменной выбрасывает ReferenceError вместо создания глобальной. Значение this в обычном вызове функции равно undefined, а не глобальному объекту. Запись в неизменяемое свойство и удаление неудаляемого дают TypeError вместо молчаливого отказа. Дублирующиеся имена параметров, конструкция with и восьмеричные литералы вида 010 становятся синтаксической ошибкой. Объект arguments перестаёт быть связан с параметрами, callee и caller недоступны, а переменные, объявленные внутри eval, не протекают наружу.
Ключевое для современного ответа: модули и тела классов строгие всегда, без всякой директивы. Значит в приложении, собранном сборщиком, она не нужна и остаётся в старых скриптах, подключаемых тегом script.
'use strict'; // только первой инструкцией файла или функции
function f() { x = 1 } // ReferenceError, а не новая глобальнаяГде спотыкаются
Говорят, что строгий режим ускоряет код. Это старое поверье из времён первых движков. Ценность режима в том, что ошибка видна сразу и в точке возникновения, а не превращается в лишнее глобальное свойство, которое всплывёт через неделю в другом месте.
Ставят директиву в середину файла или внутрь блока и считают, что она действует. Область только одна: весь файл целиком либо тело функции, и строка должна быть самой первой инструкцией. Опечатка в тексте директивы тоже проходит молча, потому что синтаксически это просто строковое выражение.
Не думают про склейку файлов. Если строгий файл окажется первым в собранном бандле, строгим станет весь бандл, и чужой старый код начнёт падать. Обратная ошибка встречается не реже: код оборачивают функцией ради своей области видимости, забывая, что this внутри обычного вызова теперь undefined, и обращение к глобальному объекту через this ломается.