Поиск…


Синтаксис

  • «использовать строгий»;
  • «использовать строгую»;
  • `использовать строгий`;

замечания

Строгий режим - это опция, добавленная в ECMAScript 5, чтобы включить несколько несовместимых друг с другом улучшений. Изменения поведения в коде «строгого режима» включают:

  • Присвоение неопределенным переменным вызывает ошибку вместо определения новых глобальных переменных;
  • Присвоение или удаление незаписываемых свойств (таких как window.undefined ) вызывает ошибку вместо window.undefined ;
  • Устаревший восьмеричный синтаксис (например, 0777 ) не поддерживается;
  • Оператор with не поддерживается;
  • eval не может создавать переменные в окружающем пространстве;
  • Функции .caller и .arguments не поддерживаются;
  • Список параметров функции не может иметь дубликатов;
  • window больше не используется автоматически в качестве значения this .

ПРИМЕЧАНИЕ . - « Строгий » режим НЕ активируется по умолчанию, как если бы страница использовала JavaScript, который зависит от особенностей нестрогого режима, тогда этот код сломается. Таким образом, он должен быть включен самим программистом.

Для всех скриптов

Строгий режим может применяться на всех сценариях, помещая инструкцию "use strict"; перед любыми другими заявлениями.

"use strict";
// strict mode now applies for the rest of the script

Строгий режим включен только в сценариях, где вы определяете "use strict" . Вы можете комбинировать сценарии с строгим режимом и без него, потому что строгое состояние не разделяется между разными сценариями.

6

Примечание. Весь код, написанный внутри модулей и классов ES2015 +, по умолчанию строгий.

Для функций

Строгий режим также может применяться к отдельным функциям, добавляя "use strict"; в начале объявления функции.

function strict() {
   "use strict";
   // strict mode now applies to the rest of this function
   var innerFunction = function () {
     // strict mode also applies here
   };
}

function notStrict() {
  // but not here
}

Строгий режим также применим к любым внутренним облачным функциям.

Изменения в глобальных свойствах

В области нестрогового режима, когда переменная назначается без инициализации с помощью ключевого слова var , const или let , она автоматически объявляется в глобальной области:

a = 12;
console.log(a); // 12

Однако в строгом режиме любой доступ к необъявленной переменной вызовет ошибку ссылки:

"use strict";
a = 12; // ReferenceError: a is not defined
console.log(a);

Это полезно, потому что JavaScript имеет ряд возможных событий, которые иногда бывают неожиданными. В нестандартном режиме эти события часто заставляют разработчиков полагать, что они являются ошибками или неожиданным поведением, поэтому, если включить строгий режим, любые возникающие ошибки заставляют их точно знать, что делается.


"use strict";
                       // Assuming a global variable mistypedVariable exists
mistypedVaraible = 17; // this line throws a ReferenceError due to the 
                       // misspelling of variable

Этот код в строгом режиме отображает один возможный сценарий: он выдает опорную ошибку, указывающую на номер строки присвоения, позволяя разработчику немедленно обнаружить тип ошибки в имени переменной.

В нестрогом режиме, помимо того, что ошибка не mistypedVaraible и назначение успешно выполнено, mistypedVaraible будет автоматически объявлен в глобальной области как глобальная переменная. Это означает, что разработчику необходимо вручную искать это задание в коде.


Кроме того, заставляя объявление переменных, разработчик не может случайно объявить глобальные переменные внутри функций. В нестрогом режиме:

function foo() { 
   a = "bar"; // variable is automatically declared in the global scope
}
foo();
console.log(a); // >> bar

В строгом режиме необходимо явно объявить переменную:

function strict_scope() { 
   "use strict";
   var a = "bar"; // variable is local
}
strict_scope();
console.log(a); // >> "ReferenceError: a is not defined"

Эта переменная также может быть объявлена ​​вне и после функции, что позволяет использовать ее, например, в глобальной области:

function strict_scope() { 
   "use strict";
   a = "bar"; // variable is global
}
var a;
strict_scope();
console.log(a); // >> bar

Изменения свойств

Строгий режим также предотвращает удаление удаляемых свойств.

"use strict";
delete Object.prototype; // throws a TypeError

Вышеприведенный оператор просто игнорируется, если вы не используете строгий режим, однако теперь вы знаете, почему он не выполняется так, как ожидалось.

Это также препятствует расширению не расширяемого имущества.

var myObject = {name: "My Name"}
Object.preventExtensions(myObject);

function setAge() {
    myObject.age = 25;   // No errors
}

function setAge() {
    "use strict";
    myObject.age = 25;  // TypeError: can't define property "age": Object is not extensible
}

Поведение списка аргументов функции

arguments объекта ведут себя по-разному в строгом и нестандартном режиме. В нестрогом режиме объект argument будет отражать изменения в значении параметров, которые присутствуют, однако в строгом режиме любые изменения значения параметра не будут отражаться в объекте argument .

function add(a, b){
    console.log(arguments[0], arguments[1]); // Prints : 1,2

    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // Prints : 5,10
}

add(1, 2);

Для приведенного выше кода объект arguments изменяется при изменении значения параметров. Однако для строгого режима это не отразится.

function add(a, b) {
    'use strict';

    console.log(arguments[0], arguments[1]); // Prints : 1,2

    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // Prints : 1,2
}

Стоит отметить, что если какой-либо из параметров не undefined , и мы пытаемся изменить значение параметра как в режиме строгого режима, так и в нестрочном режиме, объект arguments остается неизменным.

Строгий режим

function add(a, b) {
    'use strict';

    console.log(arguments[0], arguments[1]); // undefined,undefined 
                                             // 1,undefined
    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // undefined,undefined
                                             // 1, undefined
}
add();
// undefined,undefined 
// undefined,undefined

add(1)
// 1, undefined
// 1, undefined

Нестрогий режим

function add(a,b) {

    console.log(arguments[0],arguments[1]);

    a = 5, b = 10;

    console.log(arguments[0],arguments[1]);
}
add();
// undefined,undefined 
// undefined,undefined

add(1);
// 1, undefined
// 5, undefined

Повторяющиеся параметры

Строгий режим не позволяет использовать повторяющиеся имена параметров функции.

function foo(bar, bar) {}  // No error. bar is set to the final argument when called

"use strict";
function foo(bar, bar) {}; // SyntaxError: duplicate formal argument bar

Область функций в строгом режиме

В строгом режиме функции, объявленные в локальном блоке, недоступны вне блока.

"use strict";
{
  f(); // 'hi'
  function f() {console.log('hi');}
}
f(); // ReferenceError: f is not defined

Сфера применения, объявления функций в строгом режиме имеют тот же тип привязки, что и let или const .

Непростые списки параметров

function a(x = 5) {
  "use strict";
}

является недопустимым JavaScript и будет SyntaxError потому что вы не можете использовать директиву "use strict" в функции с списком SyntaxError параметров, например, выше - присваивание по умолчанию x = 5

Непростые параметры включают:

  • Значение по умолчанию
function a(x = 1) {
  "use strict";
}
  • деструктурирующие
function a({ x }) {
  "use strict";
}
  • Параметры отдыха
function a(...args) {
  "use strict";
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow