Strict Mode - это новая функция Ecmascript 5. Он позволяет вам разместить всю программу или функцию в «строгой» контексте работы. Этот строгий контекст предотвращает определенные операции и бросает больше исключений.
В то время как Ecmascript 5 обратно совместим с Ecmascript 3, в строгом режиме все функции, которые не предпочитаются в ECMASCRIPT 3, отключены (или бросают ошибку), а не совместимы.
Включение строгого режима имеет следующие преимущества:
1. Поймайте некоторые ошибки программирования и бросите исключения.
2. Предотвратить некоторые относительно «небезопасные» операции (например, доступ к глобальным переменным), и исключения брошены.
3. Отключить некоторые запутанные черты.
Большинство информации о строгом режиме можно найти на странице 223 кода ES5 [PDF].
(Примечание: строгий режим Ecmascript 5 отличается от строгого режима Firefox)
Как включить строгий режим
Добавьте это утверждение в начале программы, чтобы включить строгий режим для всего сценария:
Кода -копия выглядит следующим образом:
«Использовать строго»;
Вы также можете включить строгий режим только внутри функции, чтобы не повлиять на внешнюю часть:
Кода -копия выглядит следующим образом:
функция imstrict () {
«Использовать строго»;
// ... ваш код ...
}
Оператор, который позволяет строгому режиму, - это просто обычная строка «используйте строго», без какого -либо нового синтаксиса. Это означает, что не будет негативного влияния на старый браузер.
Одно практическое применение включения строгого режима внутри функции - определить всю библиотеку классов JavaScript внутри строгой функции режима, чтобы не влиять на внешний код:
Кода -копия выглядит следующим образом:
// Нестровный код ...
(function () {
«Использовать строго»;
// Определите свою библиотеку строго ...
}) ();
// Нестровный код ...
Итак, какие изменения были внесены в сценарии в строгом режиме?
Переменные и свойства
Присвоение неопределенной переменной не будет сбой, вместо использования этой переменной в качестве глобальной переменной.
Написание свойства с помощью письменного свойства False, удаление свойства с настраиваемым свойством с помощью FALSE или добавление свойства с расширяемым свойством с FALSE, приведет к ошибке (эти характеристики предварительно согласованы). В прошлом эти операции не делали исключения, но просто молча не смогли.
Выполнение операций удаления по переменным, функциям или параметрам функций вызовет ошибку.
Кода -копия выглядит следующим образом:
var foo = 'test';
Function test () {}
Удалить foo; // Ошибка
Удалить тест; // Ошибка
Функциональный тест2 (arg) {
Удалить arg; // Ошибка
}
Определение того же свойства внутри контейнера объекта приведет к брошению исключения:
Кода -копия выглядит следующим образом:
// Ошибка
{foo: true, foo: false}
оценка
Любое использование имени «Eval» (основная цель - указать функцию Eval на свойство переменной или объекта) запрещено.
Кода -копия выглядит следующим образом:
// Все генерируют ошибки ...
obj.eval = ...
obj.foo = eval;
var eval = ...;
для (var eval in ...) {}
функция eval () {}
Функциональный тест (eval) {}
function (eval) {}
новая функция ("eval")
Кроме того, объявление новых переменных через Eval также будет недействительным:
Кода -копия выглядит следующим образом:
eval ("var a = false;");
print (typeof a); // неопределенный
функция
Переписать объект аргументов вызовет ошибку:
Кода -копия выглядит следующим образом:
аргументы = [...]; // не разрешен
Параметры с тем же именем вызовут ошибку:
Кода -копия выглядит следующим образом:
(function (foo, foo) {}) // Ошибка
Доступ к Arguments.caller и Arguments.callee бросает исключение. Поэтому любая анонимная функция, которую необходимо использовать, должна быть названа первой, например:
Кода -копия выглядит следующим образом:
settimeout (функция позже () {
// делать вещи ...
SetTimeout (позже, 1000);
}, 1000);
Свойства функции, абонента и Callee больше не существуют, и операция по их определению также запрещена.
Кода -копия выглядит следующим образом:
Function test () {}
test.caller = 'caller'; // Ошибка
Наконец, была решена давняя (и очень раздражающая) ошибка: когда нулевой или неопределенный используется в качестве первого параметра функции. Prototype.call или function.prototype.apply, этот внутри функции будет указывать на глобальный объект. И строгий режим предотвратит его выполнение и исключения:
Кода -копия выглядит следующим образом:
(function () {...}). Call (null); // Исключение
с() { }
Оператор с () {} полностью висит в строгом режиме.