С кодом будь строг. Интерпретатор

Строгий контроль написания кода уменьшает количество потенциальных ошибок. 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
	}
}());
Share
Send
1 comment
ogojack
Забыл упомянуть,что this уже не ссылается на глобальный объект, если оно не указано явно.
Popular