Очень долго язык JavaScript развивался без потери совместимости. Новые возможности добавлялись в язык, но старые -- никогда не менялись, чтобы не "сломать" уже существующие HTML/JS-страницы с их использованием.
Однако, это привело к тому, что любая ошибка в дизайне языка становилась "вмороженной" в него навсегда.
Так было до появления стандарта ECMAScript 5 (ES5), который одновременно добавил новые возможности и внёс в язык ряд исправлений, которые могут привести к тому, что старый код, который был написан до его появления, перестанет работать.
Чтобы этого не случилось, решили, что по умолчанию эти опасные изменения будут выключены, и код будет работать по-старому. А для того, чтобы перевести код в режим полного соответствия современному стандарту, нужно указать специальную директиву use strict
.
Эта директива не поддерживается IE9-.
Директива выглядит как строка "use strict";
или 'use strict';
и ставится в начале скрипта.
Например:
"use strict";
// этот код будет работать по современному стандарту ES5
...
```warn header="Отменить действие use strict
никак нельзя"
Не существует директивы `no use strict` или подобной, которая возвращает в старый режим.
Если уж вошли в современный режим, то это дорога в один конец.
```smart header="`use strict` для функций"
Через некоторое время мы будем проходить [функции](/function-basics). На будущее заметим, что `use strict` также можно указывать в начале функций, тогда строгий режим будет действовать только внутри функции.
В следующих главах мы будем подробно останавливаться на отличиях в работе языка при use strict
и без него.
Если говорить абстрактно, то -- да, нужен. В строгом режиме исправлены некоторые ошибки в дизайне языка, и вообще, современный стандарт -- это хорошо.
Однако, есть и две проблемы.
Поддержка браузеров IE9-, которые игнорируют "use strict"
.
: Предположим, что мы, используя "use strict"
, разработали код и протестировали его в браузере Chrome. Всё работает... Однако, вероятность ошибок при этом в IE9- выросла! Он-то всегда работает по старому стандарту, а значит, иногда по-другому. Возникающие ошибки придётся отлаживать уже в IE9-, и это намного менее приятно, нежели в Chrome.
Впрочем, проблема не так страшна. Несовместимостей мало. И если их знать (а в учебнике мы будем останавливаться на них) и писать правильный код, то всё будет в порядке и `"use strict"` станет нашим верным помощником.
Библиотеки, написанные без учёта "use strict"
.
: Некоторые библиотеки, которые написаны без "use strict"
, не всегда корректно работают, если вызывающий код содержит "use strict"
.
В первую очередь имеются в виду сторонние библиотеки, которые писали не мы, и которые не хотелось бы переписывать или править.
Таких библиотек мало, но при переводе давно существующих проектов на `"use strict"` эта проблема возникает с завидной регулярностью.
Вывод?
Писать код с use strict
следует лишь в том случае, если вы уверены, что описанных выше проблем не будет.
Конечно же, весь код, который находится в этом учебнике, корректно работает в режиме "use strict"
.
Браузер IE8 поддерживает только совсем старую версию стандарта JavaScript, а именно ES3.
К счастью, многие возможности современного стандарта можно добавить в этот браузер, подключив библиотеку ES5 shim, а именно -- скрипты es5-shim.js
и es5-sham.js
из неё.
В этой главе мы познакомились с понятием "строгий режим".
Далее мы будем предполагать, что разработка ведётся либо в современном браузере, либо в IE8- с подключённым ES5 shim. Это позволит нам использовать большинство возможностей современного JavaScript во всех браузерах.
Очень скоро, буквально в следующей главе, мы увидим особенности строгого режима на конкретных примерах.