Конспект JS-course

Строгий режим "use strict"

Источник: 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
    }
}());