Содержание
- 1 Предотвратить дубликаты в объекте
- 2 Использование с заявлением запрещено
- 3 Предотвращает объявление глобальной переменной
- 4 Предотвращает использование зарезервированного ключевого слова в качестве имени переменной
- 5 Аргументы в качестве идентификатора или изменения переменной Arguments
- 6 Переменная, объявленная внутри функции eval
- 7 Запрещает восьмеричный синтаксис
- 8 Расширение нерасширяемого свойства объекта
- 9 Поддерживаемые браузеры
Строгий режим вносит несколько изменений в способ обработки Javascript интерпретатором. Строгий режим устраняет некоторые тихие ошибки JavaScript, изменяя их на выдачу ошибок. Строгий режим исправляет ошибки, мешающие движкам JavaScript выполнять оптимизацию: иногда код строгого режима может выполняться быстрее, чем идентичный код, который не является строгим режимом, и запрещает некоторый синтаксис, который может быть определен в будущих версиях ECMAScript (т. Е. Классы и т. Д.) ,
Строгий режим относится ко всем сценариям или же к отдельным функциям. Это не относится к операторам блока, заключенным в {};
попытка применить его к таким контекстам ничего не делает. В основном то, что использует строгий, — это введение лучшей проверки ошибок в ваш код.
Строгий режим можно включить, добавив строку со следующим содержимым поверх вашего скрипта «use strict»; т.е.
В теге сценария или указанном файле:
"use strict";
// Execute some script strictly
На функции (анонимный или не анонимный)
(function(){"use strict";
// All the code will be analyzed in strict mode
})();
function myAction(){
"use strict";
// Threat me strictly
}
Предотвратить дубликаты в объекте
Следующий объект имеет 2 свойства с одинаковым именем:
var myObject = {
hello:"A string",
anotherProperty:2,
other:"Hi",
hello:"A string"
};
Без в строгом режиме объект будет иметь свойство, но с последним объявленным значением. С строгий режим, JS интерпретатор скинет Uncaught SyntaxError: Duplicate data property in object literal not allowed in strict mode
,
Использование с заявлением запрещено
Использование оператора with в строгом режиме:
"use strict";
var a, x, y;
var r = 10;
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI / 2);
}
Бросит Uncaught SyntaxError: Strict mode code may not include a with statement
, Использование оператора with не рекомендуется, как это может быть источником запутанных ошибок и проблем совместимости.
Предотвращает объявление глобальной переменной
Объявление глобальной переменной в области действия запрещено, например:
var history = [];
function ExecuteSomething(message){
// Note that the code doesnt use => var toSaveInHistory, therefore there is an error
toSaveInHistory = message;
return console.log(message);
}
ExecuteSomething("My custom log");
Предыдущий код бросил бы Uncaught ReferenceError: toSaveInHistory is not defined
потому что действительно toSaveInHistory не объявлен в закрытии. Строгий режим запрещает неявное создание глобального свойства.
Предотвращает использование зарезервированного ключевого слова в качестве имени переменной
Использование будущего зарезервированного слова для идентификатора недопустимо. Имя идентификатора зарезервировано в строгом режиме, т.е.
- инвентарь
- интерфейс
- пакет
- частный
- защищенный
- общественности
- статический
- Уступать
Аргументы в качестве идентификатора или изменения переменной Arguments
В строгом режиме переменная «arguments» (которая идентифицируется как массив во всех функциях, эта переменная содержит все аргументы, которые были отправлены на выполнение функции, нельзя использовать в качестве идентификатора (имя переменной или функции, имя параметра и т. д.), а также не изменять значения членов локального объекта аргументов, т.е.
"use strict";
var arguments = "something";
// Throws => Invalid usage of 'arguments' in strict mode
// or
function executeSomething(age,name){
arguments[0] = 12;
return true;
}
executeSomething(15,"Batman");
Переменная, объявленная внутри функции eval
Если переменная объявлена внутри функции eval, она не может использоваться вне этой функции, т.е.
eval("var myVariable = 10;");
document.write(myVariable);
Предыдущий код бросает 'myVariable' is undefined
,
Запрещает восьмеричный синтаксис
Присвоение восьмеричного значения числовому литералу или попытка использовать экранирование восьмеричного значения не допускается, т.е.
var myOctal = 012;
var myEscapedOctal = \012;
Предыдущий код бросает Octal numeric literals and escape characters not allowed in strict mode
,
Расширение нерасширяемого свойства объекта
Без строгого режима многие вещи игнорируются, так как добавление свойства к нерасширяемому объекту ничего не даст. Но если включен строгий режим, вы получите исключение, т.е.
var myItem = {};
Object.preventExtensions(myItem);
myItem.otherProperty = 222;
Предыдущий код бросает Cannot create property for a non-extensible object
,
Поддерживаемые браузеры
В настоящее время строгое использование поддерживается всеми основными браузерами (кроме IE 9 и ниже). Для получения дополнительной информации см. Могу ли я использовать использовать строгий. Однако в Интернете есть много мест, где они говорят, что использовать строгий режим в ie8 или 9 не проблема., если ты все еще сомневаешься, просто доверься Microsoft :