Несколько интересных фактов о строгом режиме в JavaScript.
Во время собеседования интервьюер спросит: Что такое строгий режим в JavaScript? Каков ваш ответ, как у интервьюируемого?
Младшие разработчики в вашей команде просят научить строгий режим. Как старший разработчик, как вы собираетесь объяснять?
Строгий режим позволяет писать безопасные программы без ошибок.
Как…🤔
- Строгий режим устраняет некоторые тихие ошибки JavaScript, заменяя их ошибками генерирования.
- Исправлены ошибки, из-за которых движкам JavaScript было сложно выполнять оптимизацию. Код строгого режима иногда можно заставить работать быстрее, чем идентичный код, но не в строгом режиме.
- Запрещает некоторый синтаксис, который, вероятно, будет определен в будущих версиях ECMAScript.
Как использовать строгий режим?
Синтаксис вызова строгого режима: 'use strict';
(или "use strict";
).
В JavaScript существует два способа вызова строгого режима:
- Вызов для всего скрипта в глобальной области.
- Вызов для отдельной функции.
Вызов для всего скрипта в глобальной области
'use strict'; // Apply strict mode to the entire script fullName = 'John Doe'; const userObj = { name: this.fullName, sayMySelf: function() { age = 30; console.log(`I am ${this.name} and I am a ${age} years old!`); } } userObj.sayMySelf();
В приведенной выше программе строгий режим будет применен ко всему сценарию и выдаст переменным not defined
ошибки как для fullName
, так и для age.
.
Вызов для отдельной функции
fullName = 'John Doe'; const userObj = { name: this.fullName, sayMySelf: function() { 'use strict'; // Apply to the sayMySelf function age = 30; console.log(`I am ${this.name} and I am a ${age} years old!`); } } userObj.sayMySelf();
В приведенной выше программе строгий режим будет применен только к функции sayMySelf
и выдаст ошибку age is not defined
.
Использование необъявленных переменных в строгом режиме
'use strict'; const user = { name: 'John Doe', sayName: function () { console.log(fullName) } } user.sayName();
В приведенном выше примере кода используется необъявленная переменная fullName
внутри функции sayName
. В строгом режиме приведенный выше код выдает ошибку ссылки, указывающую, что fullName
не определен.
Однако что произойдет, если мы присвоим значение имени (в нашем случае fullName
), которое не было объявлено с помощью let
, const
или var
?
Если бы мы сделали это в строгом режиме, это даст ту же ошибку выше.
Но если это без строгого режима, это приведет к созданию новой глобальной переменной. Он будет глобальным независимо от того, насколько глубоко он вложен в функции и блоки в нашем коде, что почти наверняка не то, что вам нужно, подвержено ошибкам и является одной из лучших причин для использования строгого режима. . Проверьте приведенный ниже пример кода для получения дополнительных разъяснений.
const objectOne = { name: 'John Doe', setName: function () { fullName = 'John Doe'; } } const objectTwo = { name: 'John Doe', sayName: function () { console.log(fullName); // Will print John Doe } } objectOne.setName(); objectTwo.sayName(); console.log(fullName); // Will print John Doe
Использование ключевого слова delete
в строгом режиме
Удаление переменной или функции в строгом режиме не допускается и приведет к ошибке.
'use strict'; const x = 3; function y() {}; // These will cause errors delete x; delete y;
Позвольте мне показать вам интересную вещь об операторе delete
. Забудьте на мгновение о строгом режиме. Что будет на выходе, если мы запустим приведенный ниже код в веб-браузере?
fullName = 'John Doe'; var x = 3; delete fullName; delete x; console.log(window.x); // this will log 3 to the browser console console.log(window.fullName); // this will log undefined
В приведенном выше примере fullName
также создается в глобальной области видимости, как и переменные, определенные с помощью ключевого слова var
. Но в отличие от свойств, определяемых правильными объявлениями var
, эти свойства можно удалить с помощью оператора delete
.
Для получения дополнительной информации об операторе delete
:
const cities = ["Colombo", "London", "New Delhi"]; delete cities[2]; console.log(2 in cities); // true or false ? console.log(cities.length); // 3 or 2 ?
Использование eval() в строгом режиме
eval()
позволяет создавать переменные и функции в той области видимости, где она вызывается. Кроме того, eval()
позволяет изменить значение переменной или поведение функции, которая имеет ту же локальную область видимости, что и eval()
.
var x = 1; eval('var x = 2; var y = 4;'); function fn() { console.log(1); } eval('function fn() { console.log(2) };'); fn();
Строгий режим не позволяет создавать переменные с использованием eval()
в той области, в которой он вызывается, а также не позволяет изменять значение переменной или поведение функции, которая имеет ту же локальную область действия, что и eval()
.
Кроме того, строгий режим делает eval()
еще более похожим на оператор, эффективно превращая eval в зарезервированное слово. Нам не разрешено перезаписывать функцию eval()
новым значением. И нам не разрешено объявлять переменную, функцию, параметр функции или параметр блока перехвата с именем оценка.
Использование с оператором в строгом режиме
Оператор with
запускает блок кода, как если бы свойства указанного объекта были переменными в области действия этого кода. Не понял?
Взгляните на пример кода.
var x = Math.round(9.75); var pi = Math.PI;
Мы можем написать приведенный выше пример кода следующим образом, используя with
.
with (Math) { var x = round(9.75); var pi = PI; }
В строгом режиме нельзя использовать оператор with
, и его следует считать устаревшим в нестрогом режиме. По возможности избегайте его использования. Код JavaScript, использующий with
, трудно оптимизировать, и он, скорее всего, будет работать значительно медленнее, чем эквивалентный код, написанный без оператора with
.
Использование этого в строгом режиме
Для вызова функции в нестрогом режиме контекст вызова (this
) является глобальным объектом. Однако в строгом режиме контекст вызова — undefined
. Обратите внимание, что функции, определенные с использованием синтаксиса стрелки, ведут себя по-разному. Они всегда наследуют значение this
, которое действует там, где они определены.
Когда функция вызывается с call()
или apply()
, значение this
точно соответствует значению, переданному в качестве первого аргумента для call()
или apply()
.
В нестрогом режиме значения null
и undefined
заменяются глобальным объектом, а необъектные значения преобразуются в объекты.
Если вам нужны дополнительные разъяснения с примерами кода, прочитайте мою предыдущую статью.
Кроме того, строгий режим ограничивает использование JavaScript.
- Присвоение свойств, недоступных для записи, и попытки создать новые свойства для нерасширяемых объектов вызывают TypeError. В нестрогом режиме эти попытки завершаются автоматически.
- Синтаксической ошибкой является определение литералом объекта двух или более свойств с одним и тем же именем. В нестрогом режиме ошибок не возникает.
- Синтаксической ошибкой является наличие в объявлении функции двух или более параметров с одинаковыми именами.
- восьмеричные целочисленные литералы (начинающиеся с 0, за которым не следует x) не допускаются. В нестрогом режиме некоторые реализации допускают восьмеричные литералы.
- Возможность проверки стека вызовов ограничена.
arguments.caller
иarguments.callee
выдают ошибку TypeError в функции строгого режима. Функции строгого режима также имеют свойства вызывающего объекта и аргумента, которые при чтении выдают TypeError. (Некоторые реализации определяют эти нестандартные свойства для нестрогих функций.)
Для создания этой статьи я использовал книгу JavaScript: полное руководство, написанную Дэвидом Фланаганом.
Спасибо за чтение.😍
Вы энтузиаст JavaScript?
Пожалуйста, прочитайте приведенные ниже статьи, написанные мной, чтобы узнать некоторые интересные вещи о JavaScript.
- Функции стрелок против. Обычные функции в JavaScript — полное руководство
- Подъем JavaScript — полное руководство
- Локальное хранилище по сравнению с Хранилище сеансов в JavaScript — подробное руководство
Надеюсь, вы узнаете что-то новое, прочитав эту статью. Пожалуйста, подпишитесь на меня, чтобы читать статьи такого типа в будущем. Здоровья!
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Загляните в наше Сообщество Discord и присоединитесь к нашему Коллективу талантов.