# 07. Strict Mode

Строгий режим включается при помощи декларации `'use strict'` добавляемой в начало JS файла или функции.

```javascript
"use strict"

function strictFn() {
    "use strict"
    ...
}
```

В строгом режиме были добавлены новые ключевые слова, используемые в ES6, такие как `let, implements, yield, static` и др.

В ES6 весь код в модулях по умолчанию выполняется в строгом режиме. Таким образом со временем весь JS код будет работать в строгом режиме.

**Языковые конструкции**:

* Не допускается использовать литералы восьмеричных целых чисел, например `00840`.
* Не допускается использование инструкции `with`
* Все переменные должны объявляться. В нестрогом режиме такая попытка просто создаст новую глобальную переменную и добавит ее в виде свойства в глобальный объект.
* Возбуждается исключение `SyntaxError`, если оператору `delete` передать неквалифицированный идентификатор, такой как имя переменной, функции или параметра функции.
* Код, передаваемый функции `eval()`, не может объявлять переменные или функции в области видимости вызывающего программного кода, как это возможно в нестрогом режиме. Вместо этого переменные и функции помещаются в новую область видимости, создаваемую для функции `eval()`. Эта область видимости исчезает, как только `eval()` вернет управление.
* Идентификаторы `eval` и `arguments` интерпретируются как ключевые слова, и вы не можете изменить их значения.
* Нельзя использовать новые языковые конструкции, типа `protected`, `static`, `interface` и т.д.

**Функции**:

* Определение двух или более параметров с одинаковыми именами в объявлении функции считается синтаксической ошибкой.
* Функции, которые вызываются как функции (а не как методы), получают в `this` значение `undefined` (в нестрогом режиме функции, которые вызываются как функции, всегда получают в ссылке `this` глобальный объект).
* Объект `arguments` в функции хранит статическую копию значений, переданных функции. В нестрогом режиме объект `arguments` ведет себя иначе – элементы массива `arguments` и именованные параметры функции ссылаются на одни и те же значения.
* Ограничивается возможность просмотра стека вызовов. Попытки обратиться к свойствам `arguments.caller` и `arguments.callee` в строгом режиме возбуждают исключение `TypeError`.

**Объекты**:

* Попытки присвоить значения свойствам, недоступным для записи, или создать новые свойства в нерасширяемых объектах порождают исключение `TypeError`.
* Попытка удалить ненастраиваемое свойство приведет к исключению `TypeError`.
* Попытка определить в литерале объекта два или более свойств с одинаковыми именами считается синтаксической ошибкой.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://strctr.gitbook.io/programming/01-languages/javascript/01-language/a-core/a1-javascript-execution/07-strict-mode.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
