Строгий режим, use strict
Современная спецификация языка содержит ряд несовместимых изменений, по сравнению со старым стандартом. Чтобы не ломать существующий код, они, в основном, включаются при наличии специальной директивы use strict. Эта директива не поддерживается IE9-.
Современная спецификация языка содержит ряд несовместимых изменений, по сравнению со старым стандартом.
Чтобы не ломать существующий код, они, в основном, включаются при наличии специальной директивы use strict. Эта директива не поддерживается IE9-.
"use strict"
Директива выглядит как строка "use strict"; или 'use strict';, и может стоять в начале скрипта, либо в начале функции, например:
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки
"use strict"; // этот код будет работать по стандарту ES5<br>
Например, присвоение переменной без объявления в старом стандарте было допустимо, а в современном — нет.
Поэтому следующий код выдаст ошибку:
"use strict"; x = 5; // error: x is not defined<br>
Директиву нужно указывать до кода, иначе она не сработает:
var a; "use strict"; x = 5; // ошибки не будет, строгий режим не включен<br>
На уровне функции
Допустим, код работает только в старом режиме, но мы хотим написать новые функции, используя современный стандарт.
Директиву "use strict"; можно указать в начале функции, тогда она будет действовать только в ней.
Например, в коде ниже используются переменные без объявления. Но ошибка будет выведена только при запуске функции, так как именно она работает в строгом режиме:
function sayHi(person) { "use strict"; message = "Привет, " + person; // error: message is not defined //... } person = "Вася"; sayHi(person);<br>
Отменить действие "use strict" никак нельзя.
Если директива указана на уровне скрипта, то действует и на все функции.
Использовать ли use strict?
Строгий режим даёт две вещи:
- Там, где в старом стандарте был «кривой код», в новом будет ошибка.
- Некоторые возможности языка работают по-другому. Более корректно, но по-другому. По ходу учебника мы увидим много конкретных примеров этих различий.
Всё это хорошо.
Но основная проблема при использовании этой директивы — поддержка браузеров IE9-, которые игнорируют use strict и работают только в старом стандарте.
Действительно, предположим, что мы, используя эту директиву, разработали код в Chrome. Всё работает… Однако, вероятность ошибок при этом в IE9- выросла! Так как там поддерживается только старый стандарт, возможны ошибки совместимости. А отлаживать код, чтобы найти эти ошибки, в IE9- намного менее приятно, чем в Chrome.
Тем не менее, строгий режим — это наше будущее. Поэтому его лучше использовать. Но при этом нужно очень хорошо знать отличия в работе JavaScript между старым и новым режимом, чтобы код, который вы напишете, не «ломался» при запуске в режиме старого стандарта.