Принцип неопределенности джаваскрипта
undefined -- это глобальная переменная со значением undefined. Она не является константой или ключевым словом и с легкостью может быть переопределена.
Естественно, защититься от этого поведения можно достаточно легко и не принужденно. Варианты:
- вместо слова
undefinedиспользовать любое выражение, возвращающееundefined. Допустим,void(0). - объявить локальную переменную undefined со значением по-умолчанию
undefined. - Добавить дополнительный формальный параметр в вызваемую функцию и не передавать фактический:
(function(undefined) { /* ... */ })() 'undefined' === typeof variableне зависит от переопределенной переменнойundefined
Вариант if(something) {} писать нельзя, ибо пустая строка, ноль при конвертировании в boolean тоже возвращают false. А задача стоит на проверку undefined значения.
При всех описанных вариантах необходимо помнить о таком поведении интерпретатора и постоянно заботиться о защите от переопределения.
Начиная с ECMAScript 5 включена поддержка строгого режима (англ. strict mode) в котором помимо всего прочего есть поддержка read-only свойств объекта. Используя строгий режим, включим у window.undefined режим ‘только для чтения’:
"use strict";
Object.defineProperty(window, "undefined", {
value: void(0),
writable: false
});
После выполнения этого кода любая попытка переопределить undefined свойство объекта window ни к чему не приведет. Интерпретатор проигнорирует переопределение.
Поддержка браузеров, кстати, обнадеживает. Игнорируя Internet Explorer восьмой версии, можно смело пользоваться! Что касается серверного джаваскрипта, то можете быть спокойны -- undefined не переопределяется.
Предупреждение: Будьте бдительны! Строгий режим на то и строгий, чтобы бить по рукам за каждую оплошность.
Ссылки по теме:
