Несколько интересных фактов о строгом режиме в JavaScript.

Во время собеседования интервьюер спросит: Что такое строгий режим в JavaScript? Каков ваш ответ, как у интервьюируемого?
Младшие разработчики в вашей команде просят научить строгий режим. Как старший разработчик, как вы собираетесь объяснять?

Строгий режим позволяет писать безопасные программы без ошибок.

Как…🤔

  • Строгий режим устраняет некоторые тихие ошибки JavaScript, заменяя их ошибками генерирования.
  • Исправлены ошибки, из-за которых движкам JavaScript было сложно выполнять оптимизацию. Код строгого режима иногда можно заставить работать быстрее, чем идентичный код, но не в строгом режиме.
  • Запрещает некоторый синтаксис, который, вероятно, будет определен в будущих версиях ECMAScript.

Как использовать строгий режим?

Синтаксис вызова строгого режима: 'use strict'; (или "use strict";).
В JavaScript существует два способа вызова строгого режима:

  1. Вызов для всего скрипта в глобальной области.
  2. Вызов для отдельной функции.

Вызов для всего скрипта в глобальной области

'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.

Надеюсь, вы узнаете что-то новое, прочитав эту статью. Пожалуйста, подпишитесь на меня, чтобы читать статьи такого типа в будущем. Здоровья!

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Загляните в наше Сообщество Discord и присоединитесь к нашему Коллективу талантов.