Источник: http://dmitrypodgorniy.com/blog/2012/07/09/1/
Автор: Дмитрий Подгорный
Строгий контроль написания кода уменьшает количество потенциальных ошибок. javascript допускает многие вольности, при том такие, которые могут породить трудно обнаруживаемые ошибки. Тут на помощь приходят редакторы и интерпретаторы. На уровне редакторов есть несколько инструментов, статического анализа кода, а со стороны браузеров доступен строгий режим выполнения javascrip кода.
Use strict
Ниже — примеры того, где строгий режим генерирует ошибки (полное описание отличий строгого режима). Надо отметить, что генерация ошибок происходит на этапе чтения исходного файла. Это значит, что функции, объявленные в нестрогой области видимости будут без проблем вызваны из «строгих функций». Так же не рекомендуется использовать строгий режим глобально, потому что вероятнее всего он сломает 3-d party код.
Нельзя присвоить значение необъявленной переменной. Код ниже в строгом режиме вместо создания глобальной переменной выдаст ошибку.
// Нестрогое поведение
function f () {
a = 10;
}
f();
// Неожиданная глобальная переменная
console.log(a); // 10
// Строгое поведение
function f () {
'use strict';
a = 10;
}
f(); // ошибка
Запрещено дублирование имен свойств объекта.
(function () {
var obj = {
prop : true,
prop : false
}
console.warn(obj); // {prop:false}
}());
(function () {
'use strict';
var obj = {
prop : true,
prop : false
}
console.warn(obj); // error
}());
Объект arguments
— неизменяемый. Проблема заключается, в том, что изменяя arguments
, изменение коснутся и аргументов, связанных с переменными, и самое неприкольное то, что примитивные значения тоже изменятся.
function f (a, b) {
arguments[0] = 10;
console.log(a, b);
}
f(1, 99); // 10, 99
Запрещено использование arguments.callee
, и arguments.callee.caller
. Говорят, что из-за наличия такого кода, интерпретатор не может оптимизировать код. Вместо этих конструкций рекоммендуется использовать Named Function Expression.
(function waiter () {
if (condition()) {
action();
} else {
setTimeout(waiter, 50); // используем имя вместо arguments.callee
}
}());