понедельник, 22 сентября 2014 г.

Strict mode Java Scipt

Strict mode - специальный режим выполнения с более жестким следованием стандартам и измененной в ряде случаев семантикой.

Активируется директивами "use strict"; или 'use strict'; , введенными в начале области видимости (скрипт или функция) до любых других директив.

Особенности режима:

1. Невозможность использования необъявленных переменных (как глобальных, так и внутри функции). Выдает исключение (ReferenceError):

a = 3;       // Неправильно
var a = 3;   // Правильно

2. Исключение (ReferenceError) при некоторых присваиваниях (раньше просто подавлялось): глобальные переменные только для чтения (типа NaN), присваивание геттеру, присваивание non-extensible объекту).

3. Исключение (SyntaxError) при использовании delete в ряде случаев (удаление переменной, аргумента, функции, свойства с атрибутом configurable = false).

4. Исключение (SyntaxError) при дублировании свойств объекта или параметров функции при определении.

var someObj = { prop1: 10, prop2: 10, prop1: 10; } // Ошибка!
function x(param, param) { return param*param; }   // Ошибка!

5. Исключение (SyntaxError) при использовании зарезервированных слов:
implements, interface, package, private, protected, public, static, yield.

6. Исключение (SyntaxError) при использовании восьмеричных чисел:

var testoctal = 001; // Ошибка!

7. Исключение (SyntaxError) при использовании оператора with.

8. Исключение (SyntaxError) при использовании вложенных функций (если они объявляются не в теле функции, а внутри выражения или блока).

9. Исключение (SyntaxError) при использовании eval или arguments в качестве пользовательского идентификатора (переменная или имя функции).

10. Исключение (ReferenceError) при использовании переменной, объявленной внутри блока eval вне этого блока.

11. В strict mode массив arguments содержит копии параметров, переданных функции, поэтому его редактирование не изменяет сами параметры.

function x(param1, param2, param3) {
    arguments[0] = 4;
    return param1;
}

console.log(x(1,2,3));    // 1 - в обычном режиме, 4 - strict mode.

12. Исключение (ReferenceError) при использовании свойств caller, callee объекта arguments.

13. this не преобразуется в указатель на глобальный объект, если его значение null или undefined.

Для получения ссылки на Global Object можно использовать следующий код, работающий в обоих режимах:

var global = (0, eval)('this');

Комментариев нет :

Отправить комментарий