Строгой шаблон, представленный в Ecmascript5, позволяет разработчикам иметь «лучший» язык JavaScript, позволяя среде, управляемой JavaScript, иметь дело с некоторыми из наиболее распространенных и трудностей для обнаружения ошибок в процессе разработки. В течение долгого времени у меня были сомнения в строгом режиме, потому что только Firefox поддерживает строгий режим. Но сегодня все основные браузеры поддерживают строгий режим в своих последних версиях (включая IE10, Opera12 и Android 4, IOS5). Пришло время начать использовать строгий режим.
Какую роль может быть строгая модель?
Строгий шаблон вносит много изменений в JavaScript, и я разделил их на две категории (очевидные и тонкие). Цель незначительных улучшений состоит в том, чтобы решить некоторые подробные проблемы в текущем JavaScript, которые я не буду вдаваться в глубину здесь; Если вы заинтересованы, пожалуйста, прочитайте замечательный документ, написанный Dmitry Soshnikov ECMA-262-5 подробно, глава 2 Строгий режим. В основном я ввожу очевидные изменения, введенные в строгом режиме, концепции, которые вы должны знать, прежде чем использовать строгий режим, и те изменения, которые помогают вам больше всего.
Прежде чем вы начнете изучать конкретные функции, помните, что одна из основных целей строгого режима - это позволить вам отлаживать более быстрее и удобнее. Лучше добавить явную ошибку, когда среда времени выполнения обнаруживает проблему, чем молча или странно действовать (что часто бывает с средами, работающими JavaScript, которые не включают строгий режим). Строгий режим бросает больше ошибок, но это хорошо, потому что эти ошибки привлекут ваше внимание и устранение многих потенциальных проблем, которые ранее были трудно обнаружить.
Удалить с помощью ключевых слов
Во -первых, оператор с удалением в строгом режиме, а код, содержащий оператор, будет добавить исключение в строгом режиме. Итак, первый шаг к использованию строгого режима: убедитесь, что вы не используете в своем коде.
Кода -копия выглядит следующим образом:
// Следующий код JavaScript вынесет ошибку в строгом режиме
с (местоположение) {
блюд (href);
}
Предотвратить неожиданное назначение значений глобальным переменным
Во -вторых, локальные переменные должны быть объявлены до назначения. Прежде чем включен строгий режим, глобальная переменная с тем же именем создается автоматически при копировании для не выявленной локальной переменной. Это одна из наиболее распространенных ошибок в программах JavaScript, и при попытке сделать это в строгом режиме, будут выброшены явные исключения.
Кода -копия выглядит следующим образом:
// Исключение будет брошено в строгом режиме
(function () {
someundeclaredvar = "foo";
} ());
Это в функции больше не указывает на глобальный по умолчанию
Другое важное изменение в строгом режиме заключается в том, что эта функция, которая не определена или не определена (нулевая или неопределенная), не указывает на глобальную среду по умолчанию. Это приведет к некоторым ошибкам выполнения кода, которые зависят от поведения по умолчанию в функции, например:
Кода -копия выглядит следующим образом:
window.color = "red";
Функция showercolor () {
предупреждение (this.color);
}
// Ошибка будет сообщена в строгом режиме. Если это не в строгом режиме, это заставит «красный»
saycolor ();
// Ошибка будет сообщена в строгом режиме. Если это не в строгом режиме, это заставит «красный»
saycolor.call (null);
Это останется неопределенным до назначения, что означает, что при выполнении конструктора исключение будет брошено, если раньше нет четкого нового ключевого слова.
Кода -копия выглядит следующим образом:
Функция человека (имя) {
this.name = name;
}
// будет ошибка в строгом режиме
var me = person ("nicholas");
В приведенном выше коде, поскольку раньше нет нового, это в функции останется неопределенным. Поскольку вы не можете установить свойства для неопределенного, приведенный выше код принесет ошибку. В средах без строгих режимов это не копируется в окно «Глобальная переменная по умолчанию», и результатом работы будет неожиданно устанавливать атрибут имени для глобальной переменной окна.
Предотвратить переименование
При написании большого количества кода, свойства объекта и параметры функции легко случайно устанавливаются на дубликатное имя. Строгий режим явно бросит ошибки в этом случае
Кода -копия выглядит следующим образом:
// Имена повторяющихся переменных сообщат об ошибке в строгом режиме
Функция Dosomething (value1, value2, value1) {
//код
}
// Имена атрибутов с тупым объектом сообщат об ошибке в строгом режиме:
var object = {
foo: "бар",
Фу: "Баз"
};
Приведенный выше код будет считаться синтаксической ошибкой в строгом режиме и позволит вам получить подсказки до выполнения.
Безопасная оценка ()
Хотя утверждение eval () не было удалено в конце, оно все еще было улучшено в строгом режиме. Самое большое изменение заключается в том, что переменные и объявления функций, выполненные в eval (), не будут напрямую создавать соответствующие переменные или функции в текущей области, например:
Кода -копия выглядит следующим образом:
(function () {
eval ("var x = 10;");
// в не стройном режиме, предупреждение 10
// В строгом режиме исключение брошено, потому что x не определен.
предупреждение (x);
} ());
Любые переменные или функции, созданные во время выполнения eval (), сохраняются в eval (). Но вы можете явно получить результат выполнения в eval () от возвращаемого значения оператора eval (), например:
Кода -копия выглядит следующим образом:
(function () {
var result = eval ("var x = 10, y = 20; x + y");
// Остальные операторы могут быть правильно запускаться в строгом или не строгих режиме. (Результат 30)
предупреждение (результат);
} ());
Выбросить исключение при изменении атрибутов только для чтения
Ecmascript5 также вводит возможность устанавливать определенные свойства объекта только для чтения или сделать весь объект неизменным. Однако в не Strict-режиме попытка изменить свойство только для чтения пройдет только молча. Это, вероятно, произойдет с вами во время вашей работы с некоторыми местными API -интерфейсом браузера. В этом случае строгий режим будет явно бросить исключения, напоминая вам, что изменение этого свойства не разрешено.
Кода -копия выглядит следующим образом:
var person = {};
Object.DefineProperty (человек, "имя" {
Записывается: ложь,
Значение: "Николас"
});
// В нетронутом режиме молчание не удается, а исключение брошено в строгом режиме.
Person.name = "John";
В приведенном выше примере атрибут имени установлен только для чтения. Выполнение модификации атрибута имени в не Strict Mode не вызовет ошибки, но изменение не будет успешной. Но строгий режим явно бросит исключения.
ПРИМЕЧАНИЕ. Настоятельно рекомендуется включить строгий режим при определении использования любых атрибутов Ecmascript.
Как его использовать?
В современных браузерах очень легко включить строгий режим, просто нужно отобразить следующую команду в коде JavaScript
«Использовать строго»;
Хотя приведенный выше код, по -видимому, является просто строкой, которая не дает определенной переменной, это фактически означает, что двигатель JavaScript переключается в строгий режим (браузеры, которые не поддерживают строгий режим, будут игнорировать приведенный выше код и не окажут никакого влияния на последующее выполнение). Хотя вы можете применить эту инструкцию к глобальной или функции, здесь мы должны напомнить вам не включать строгий режим в глобальной среде.
Кода -копия выглядит следующим образом:
// Пожалуйста, не используйте это так
«Использовать строго»;
function dosomething () {
// Эта часть кода будет работать в строгом режиме
}
function dosomethingelse () {
// Эта часть кода также будет работать в строгом режиме
}
Хотя приведенный выше код не кажется большой проблемой. Но если вы не несете ответственности за поддержание всего кода, представленного на странице, использование строгого режима таким образом приведет к тому, что у вас возникли проблемы, вызванные тем, что сторонний код не подготовлен к строгому режиму.
Поэтому лучше всего использовать инструкции, которые включают строгий режим в функции, например:
Кода -копия выглядит следующим образом:
function dosomething () {
«Использовать строго»;
// код в этой функции будет работать в строгом режиме
}
function dosomethingelse () {
// код в этой функции не будет работать в строгом режиме
}
Если вы хотите, чтобы строгий режим был включен в более чем одной функции, используйте экспрессию функции сразу включенной (iife):
Кода -копия выглядит следующим образом:
(function () {
«Использовать строго»;
function dosomething () {
// эта функция работает в строгом режиме
}
function dosomethingelse () {
// эта функция также работает в строгом режиме
}
} ());
в заключение
Я настоятельно рекомендую вам включить JavaScript Strict Mode, который может помочь вам обнаружить ошибки, которые вы не заметили в своем коде. Не включайте его в глобальной среде, но вы можете использовать iife как можно больше (немедленно выполнить выражения функций) для применения строгих шаблонов к нескольким функциям. В начале вы столкнетесь с сообщениями об ошибках, с которыми вы никогда не сталкивались раньше, что нормально. Когда включен строгий режим, обязательно проверьте его в поддерживаемых браузерах, чтобы обнаружить новые потенциальные проблемы. Не просто добавьте строку «используйте строго» в код и предположим, что оставшийся код будет работать должным образом. Наконец, начните писать лучший код в строгом режиме.
Примечание:
Вот краткое изложение ситуаций поддержки строгого режима каждого браузера.
Вы можете проверить поддержку строгого режима текущего браузера на этой странице.
Преимущества строгого режима:
Сделайте JavaScript сильнее
1. Это больше не инкапсулируется, и в нормальном режиме это всегда было объектом.
2. Fun.caller и Fun.arguments не являются удаленными свойствами и не могут быть установлены или извлечены.
3. Arguments.caller также является атрибутом, который нельзя удалить, и он не может быть установлен или извлечен.
Проложить путь для будущих версий Ecmascript
1. Были добавлены следующие зарезервированные слова: реализации, интерфейс, пусть, пакет, частный, защищенный, публичный, статический и доходность.
2. Объявление метода должно быть размещено в передней части сценария или метода, и не может быть размещено в середине операторов, таких как если или для.