Как работает режим strict в JavaScript
Рассмотрели строгий режим strict на JavaScript, и обсудили, что это такое, как он работает и как он помогает писать лучший код.
JavaScript — универсальный и широко используемый язык программирования для веб-разработки. Однако его гибкость иногда может привести к непредвиденным последствиям, поэтому разработчикам крайне важно писать надежный и удобный для сопровождения код.
Один из способов добиться этого — использовать «строгий режим» JavaScript или режим Strict.
В этой статье мы подробно рассмотрим режим strict на JavaScript, обсудим, что это такое, как он работает и как он может помочь вам писать лучший код.
Что такое режим Strict
Строгий режим или Strict — это функция, представленная в ECMAScript 5 (ES5), которая позволяет разработчикам использовать более строгий и безопасный вариант JavaScript.
При активации он применяет строгие правила и ограничения, помогая выявлять распространенные ошибки и повышать качество кода. Строгий режим можно включить для каждого файла или функции, что позволяет разработчикам выбирать, где применять его ограничения.
Зачем использовать строгий режим
- Предотвращение ошибок. Строгий режим помогает предотвратить потенциальные ошибки, которые в обычном режиме просто игнорировались бы.
- Упрощенная отладка. Благодаря раннему обнаружению ошибок строгий режим может ускорить и повысить эффективность отладки.
- Улучшенная производительность. Некоторые оптимизации возможны только в строгом режиме, поскольку он устраняет некоторые подверженные ошибкам функции языка.
- Забота о будущем. Строгий режим запрещает использование устаревших функций или функций, которые скоро станут устаревшими, помогая вашему коду оставаться совместимым с будущими версиями JavaScript.
Как включить строгий режим
Включение строгого режима выполняется прямо в коде. Просто добавьте следующее в начало файла JavaScript:
"use strict";
Эта директива информирует интерпретатор JavaScript о необходимости применения правил Strict для всего файла или функции, в которой он появляется.
Имейте в виду, что включение строгого режима в одном скрипте или функции не влияет на другие скрипты или функции.
Использование строгого режима в Node
Node также поддерживает строгий режим. У вас есть 2 варианта с этим подходом.
Первый вариант — использовать «use strict»; в начале файлов, которые вы обрабатываете в Node.
Второй — загрузить узел через cli в строгом режиме:
node --use_strict
Главное, что следует помнить — вы загружаете всё приложение в строгом режиме. Режим затронет любые сторонние библиотеки, которые вы используете.
Если сторонняя программа плохо работает в строгом режиме, вас оповестят об этом, и, возможно, вам не следует использовать Strict.
Ограничения Strict-режима
Строгий режим применяет несколько правил и ограничений, которые помогают улучшить качество кода. Вот некоторые из наиболее значительных ограничений.
Объявление переменной
В строгом режиме вы должны объявить переменные с помощью ключевых слов var, let или const перед их использованием. В противном случае возникнет ошибка.
Это предотвратит случайное создание глобальной переменной.
// Non-strict mode undeclaredVariable = 42; // Creates a global variable // Strict mode "use strict"; undeclaredVariable = 42; // Throws a ReferenceError
Повторяющиеся имена параметров
Строгий режим запрещает функции с повторяющимися именами параметров. При попытке использовать их возникнет синтаксическая ошибка.
// Non-strict mode function duplicateParameters(a, a) < // No error >// Strict mode "use strict"; function duplicateParameters(a, a) < // Throws a SyntaxError >
Восьмеричные литералы
Восьмеричные литералы (например, 0123) не допускаются в строгом режиме, и попытка их использования приведет к синтаксической ошибке. Вместо этого используйте префикс 0o для восьмеричных чисел.
// Non-strict mode var octal = 0123; // No error // Strict mode "use strict"; var octal = 0123; // Throws a SyntaxError var octal = 0o123; // Correct octal syntax in strict mode
Назначение свойств только для чтения
В строгом режиме попытка присвоить значение свойству, доступному только для чтения (например, глобальной переменной, такой как undefined , или свойству только для чтения встроенного объекта) приведет к ошибке TypeError .
// Non-strict mode undefined = 42; // No error // Strict mode "use strict"; undefined = 42; // Throws a TypeError
Оператор with
Оператор with запрещен в строгом режиме, так как он может привести к неоднозначному и трудно отлаживаемому коду.
Использование with в строгом режиме приведет к синтаксической ошибке.
// Non-strict mode with (object) < // Do something with object's properties >// Strict mode "use strict"; with (object) < // Throws a SyntaxError >
Изменения eval
В строгом режиме eval имеет собственную область видимости, и переменные, объявленные внутри вызова eval , не попадают в окружающую область.
Кроме того, присвоение eval или использование его в качестве имени функции запрещено.
// Non-strict mode eval("var localVar = 42;"); console.log(localVar); // Logs 42 // Strict mode "use strict"; eval("var localVar = 42;"); console.log(localVar); // Throws a ReferenceError
Значение this
В нестрогом режиме значение this внутри функции, вызываемой без явного получателя (например, в качестве отдельной функции, а не метода), по умолчанию равно глобальному объекту.
В строгом режиме this является undefined , что помогает предотвратить случайные изменения глобального объекта.
// Non-strict mode function logThis() < console.log(this); >logThis(); // Logs the global object (e.g., `window` in browsers) // Strict mode "use strict"; function logThis() < console.log(this); >logThis(); // Logs `undefined`
Строгий режим JavaScript — это мощный инструмент, который может помочь вам написать более надежный, удобный в сопровождении и ориентированный на будущее код.
Применяя более строгие правила и ограничения, строгий режим помогает выявлять распространенные ошибки кодирования, повышать производительность и обеспечивать совместимость с будущими версиями JavaScript.
Поняв и приняв строгий режим, вы сможете улучшить свои навыки разработки JavaScript и создавать более качественные веб-приложения.
Режим “use strict”
В спецификации языка ES5 ввели строгий режим «use strict» , который обеспечивает более чистый JavaScript код, с меньшим количеством небезопасных особенностей. Например, строгий режим заменяет исключениями некоторые ошибки, которые ранее молча пропускались. Также строгий режим исправляет ошибки, которые мешали JavaScript-движкам выполнять оптимизацию — в некоторых случаях код в строгом режиме может быть оптимизирован для более быстрого выполнения, чем код в обычном режиме. Нормальный (нестрогий) режим иногда называют “sloppy mode”.
Для включения строгого режима нужно ввести «use strict»; в начале файла JavaScript
Обратите внимание, что JavaScript-движки, которые не поддерживают ES5, просто игнорируют эту команду, так как запись строк таким образом обычно ничего не делает.
Вы также можете включить строгий режим для каждой функции. Для этого напишите функцию следующим образом:
function foo() "use strict"; //. >
Это удобно, когда вы работаете со старым кодом, где полное переключение кода в строгий режим может плохо сказаться на его выполнении.
Строгий режим рекомендуется использовать всегда при написании нового кода, но с некоторыми предостережениями — нельзя бездумно объединять скрипты с разными режимами. А также, включение строгого режима для существующего кода может нарушить его работу. Код может полагаться на особенности или поведение, которое больше недоступно или отличается в строгом режиме. Объединение только строгих или только обычных скриптов проходит без последствий, проблему вызывает совместное использование скриптов со строгим и обычным режимом или включение строго режима для уже существующего кода.
Теперь рассмотрим некоторые особенности строго режима, которые позволяют улучшить чистоту кода и избежать возможных ошибок. В действительности, описанные здесь ограничения вам не стоит использовать даже в обычном режиме.
-
Переменные должны быть объявлены в строгом режиме Все переменные должны быть явно объявлены в строгом режиме. Это помогает предотвратить возможные ошибки и некорректную работу кода.
"use strict"; mistypedVariable = 17; > Uncaught ReferenceError: mistypedVariable is not defined
function strictFunc() "use strict"; strictVar = 123; > strictFunc(); > Uncaught ReferenceError: strictVar is not defined
function sum(a, a, c) // синтаксическая ошибка "use strict"; return a + b + c; // ошибка, если код был запущен (> Uncaught ReferenceError: b is not defined) > > Uncaught SyntaxError: Duplicate parameter name not allowed in this context
В большинстве браузеров, в настоящее время, строгий режим реализован. Однако, существуют версии браузеров, поддерживающие строгий режим лишь частично или вовсе его не поддерживающие. Старайтесь тестировать свой код в браузерах, как поддерживающих, так и не поддерживающих строгий режим. Если вы проводите тестирование только в тех браузерах, которые не поддерживают строгий режим, то вполне вероятно у вас появятся проблемы в браузерах, его поддерживающих, и наоборот.
Дата изменения: February 26, 2023
Поделиться
Обнаружили ошибку или хотите добавить что-то своё в документацию? Отредактируйте эту страницу на GitHub!
Use strict, что это? Зачем в JavaScript нужен строгий режим?
![]()
Use strict JavaScript — это модель разработки, которая часто используется в современном программировании на JavaScript. Главная особенность этого режима, что он дает возможность разработчикам использовать только ограниченный синтаксис и не допускать лишних ошибок.
Синтаксис «строгого режима» отличается от традиционного синтаксиса JavaScript. В нем не проходят многие ошибки, которые легко пройдут в стандартном. Поэтому очень часто стандартный синтаксис называют «грязным», от того что в нем многие мелкие ошибки игнорируются. Такое «игнорирование» — это не всегда плохо. В мелких проектах молодых разработчиков оно ни к чему плохому не приводит. Но если проект большой, то наличие в коде «мелких» ошибок иногда может привести к непредсказуемым результатам. И чтобы этого не произошло, разработчики применяют режим use strict при разработке на языке JavaScript.
Строгий режим не даст системе закрыть глаза на «тихие» ошибки и заставит ее остановить процесс выполнения программы в случае их обнаружения. То есть этот режим дает возможность писать программы, в которых не будет недочетов.
Use strict в JavaScript
Use strict в JavaScript может применяться ко всему документу сразу или к отдельным его функциям. Для того чтобы включить этот режим в документе, необходимо в нужном месте разместить выражение «Use strict» в одинарных или двойных кавычках.
Когда нет желания подключать весь документ к строгому режиму, нужно осторожно относит ь ся к чередованию «строгих» или «нестрогих» функций в документе. Иногда в такой смеси под «строгий режим» попадает код функции, которая для этого не рассчитана. И наоборот, код, который должен быть в «строгом» режиме, попадает под «нестрогий».
Когда нужно сделать отдельную функцию «строгой», то в ее верхней части тела нужно вписать «Use strict». При этом все , что входит в состав этой функции , будет в «строгом режиме», даже другие вложенные функции.
Отличия «use strict» и стандартный режим в JavaScript
- При режиме «strict» к неопределенной переменной не присваивается значение.
- Нельзя применить инструкцию «with».
- Нет возможности добавить повторяющиеся свойства в литерале объекта.
- Нет возможности добавить дополнительные параметры формальной функции.
- Когда изменяется объект «arguments», не изменяются аргументы.
- Когда аргумент является неизменяемым свойством объекта, то «delete» выдаст ошибку.
- Нет возможности преобразовать «this» в объект.
- Нет возможности изменять «eval» и «arguments», а также применять их в качестве имени.
- Увеличенное количество слов, которые зарезервировали для будущего применения.
- Нет возможности использовать восьмеричную систему.
- Нет возможности применять конструкции кода, которые могут затруднить оптимизацию самого кода.
- Нельзя объявить переменную в коде, который был передан методу «eval».
- Нельзя удалить обычные переменные.
- И др.
Заключение
Use strict в JavaScript — это то, что делает код чище и безопасней. Этот режим существует уже очень долго и поддерживается всеми современными браузерами. Проблемы с этим режимом могут возникнуть только в старых версиях Internet Explorer.
Use strict в JavaScript часто используется для лучшей оптимизации программы, а также для поиска «тихих» ошибок, которые могут давать неоднозначные результаты.
Часто спрашивают : «А всегда ли нужно использовать режим «use strict»? » Вообще это риторический вопрос , и однозначно на него не ответить. С одной стороны, этот режим улучшает код, но другой стороны, при кодировании в этом режиме увеличивается время разработки. Поэтому тут, скорее всего , будет зависеть от проекта и лично от вас как от разработчика : нужен он вам или нет .
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
use strict
‘use strict’ включает строгий режим выполнения JavaScript. Эта строка должна располагаться в самом начале скрипта, иначе строгий режим не будет работать. В строгом режиме интерпретатор будет явно выбрасывать ошибки на действия, которые ранее пропускал. Если строгий режим был включён, то отключить его для файла уже нельзя.
Пример
Скопировать ссылку «Пример» Скопировано
'use strict' // Располагаем строку в самом начале файла! const name = 'Alex'// . другой код'use strict' // Располагаем строку в самом начале файла! const name = 'Alex' // . другой код
Как понять
Скопировать ссылку «Как понять» Скопировано
Строгий режим был введён в JavaScript со стандартом ECMAScript 5 в 2009 году.
Этот стандарт добавил много нового в язык, но чтобы старые браузеры могли продолжать работать, был введён специальный строгий режим выполнения, который включал новые функции языка.
Строгий режим делает следующее:
- Выбрасывает ошибки, когда в коде используются некоторые небезопасные конструкции.
- Выключает функции языка, которые запутывают код и потому не должны использоваться.
- Предотвращает использование слов, которые могут быть использованы в качестве ключевых в будущем.
Давайте подробнее посмотрим некоторые важные ограничения, которые накладывает включение строгого режима.
Нельзя использовать переменные без объявления
Скопировать ссылку «Нельзя использовать переменные без объявления» Скопировано
Интерпретатор в строгом режиме выбросит ошибку, если обратиться к переменной без её объявления:
'use strict' const name = 'Anna'console.log(name)// Anna age = 24console.log(age)// Uncaught ReferenceError: age is not defined'use strict' const name = 'Anna' console.log(name) // Anna age = 24 console.log(age) // Uncaught ReferenceError: age is not defined
Без строгого режима интерпретатор в таком случае создаст переменную age в глобальной области видимости. Если выполнять код из примера в консоли браузера без ‘use strict’ , то все выполнится без ошибок, а в глобальный объект window запишется поле age со значением 24 .
Явная ошибка если значение поля нельзя изменить или удалить
Скопировать ссылку «Явная ошибка если значение поля нельзя изменить или удалить» Скопировано
С помощью методов Object . define Property ( ) или Object . prevent Extensions ( ) в JavaScript можно запретить перезаписывать поля объекта. При включённом строгом режиме попытка перезаписать поле приведёт к ошибке.
'use strict' const obj = <> Object.defineProperty(obj, 'someProp', < value: 'Alex', writable:false >) console.log(obj.someProp)// Alex obj.someProp = 'James'// Uncaught TypeError: Cannot assign to read only property 'someProp' of object #'use strict' const obj = > Object.defineProperty(obj, 'someProp', value: 'Alex', writable:false >) console.log(obj.someProp) // Alex obj.someProp = 'James' // Uncaught TypeError: Cannot assign to read only property 'someProp' of object #
'use strict' const notExtensableObj = <> Object.preventExtensions(notExtensableObj) notExtensableObj.someProp = 'Value'// Uncaught TypeError: Can't add property someProp, object is not extensible'use strict' const notExtensableObj = > Object.preventExtensions(notExtensableObj) notExtensableObj.someProp = 'Value' // Uncaught TypeError: Can't add property someProp, object is not extensible
Ошибка будет выброшена в строгом режиме и при попытке удаления поля из объекта, когда это сделать нельзя.
const obj = <> Object.defineProperty(obj, 'someProp', value: 'Anna', configurable: false>) delete obj.someProp// Uncaught TypeError: Cannot delete property 'someProp' of #const obj = > Object.defineProperty(obj, 'someProp', value: 'Anna', configurable: false >) delete obj.someProp // Uncaught TypeError: Cannot delete property 'someProp' of #
Если запустить все примеры кода выше без строгого режима, они выполнятся без ошибок, но значения полей не изменятся.
Параметры функции не могут иметь одинаковые имена
Скопировать ссылку «Параметры функции не могут иметь одинаковые имена» Скопировано
Если в функции объявить два параметра с одинаковым именем, то строгий режим выбросит ошибку выполнения.
'use strict' // Uncaught SyntaxError: Duplicate parameter name not allowed in this contextfunction sum(a, b, a) // . >'use strict' // Uncaught SyntaxError: Duplicate parameter name not allowed in this context function sum(a, b, a) // . >
Без use strict интерпретатор выполнит код без ошибок, но обратиться к переопределённому параметру будет невозможно.
function sum(a, b, a) console.log(a) console.log(b)> sum(1, 2, 3) // Выведет 3 и 2, первый аргумент потерян навсегдаfunction sum(a, b, a) console.log(a) console.log(b) > sum(1, 2, 3) // Выведет 3 и 2, первый аргумент потерян навсегда
Другое поведение this
Скопировать ссылку «Другое поведение this» Скопировано
При включённом строгом режиме this больше не будет по умолчанию ссылаться на глобальный объект.
'use strict' function logThis() console.log(this)> logThis()// Выведет undefined'use strict' function logThis() console.log(this) > logThis() // Выведет undefined
Без use strict если вызывать функцию в глобальном контексте (например в консоли браузера), то this всегда будет ссылаться на глобальный объект.
Запрещено использовать зарезервированные слова
Скопировать ссылку «Запрещено использовать зарезервированные слова» Скопировано
В строгом в режиме запрещено использовать в коде некоторые слова, которые были специально зарезервированы для того, чтобы использовать их в будущем. Это слова implements , interface , let , package , private , protected , public , static , yield . Некоторые из этих слов уже используется в данный момент: например объявление переменных через let или возвращение значения из генератора с помощью yield .
Ограничение небезопасных конструкций
Скопировать ссылку «Ограничение небезопасных конструкций» Скопировано
Дополнительно включение строгого режима не позволяет использовать в коде конструкцию with и очищает переменные, созданные с помощью eval ( ) . Обе эти конструкции устарели и являются потенциально опасными, потому не используются в современном JavaScript.
Как пишется
Скопировать ссылку «Как пишется» Скопировано
Все современные сборщики JavaScript умеют самостоятельно добавлять ‘use strict’ в файлы. Потому в данный момент обычно никто в коде явно не объявляет строгий режим. А с появлением в JavaScript модулей все они по умолчанию работают в строгом режиме.
‘use strict’ называется директивой, так как это не просто строка, а специальная инструкция для интерпретатора. Потому очень важно поместить объявление строгого режима в самом начале скрипта, чтобы это была самая первая строчка, которая исполнится.
'use strict' // Включили строгий режим // Далее остальной код'use strict' // Включили строгий режим // Далее остальной код
Если поместить строку ниже, то включение строгого режима не произойдёт.
console.log(1 + 2)// 3 'use strict' // Просто объявление строки, строгий режим не включился // Код ниже работает без строгого режимаconsole.log(1 + 2) // 3 'use strict' // Просто объявление строки, строгий режим не включился // Код ниже работает без строгого режима
Над ‘use strict’ можно размещать только комментарии.