@Alexey Osipenko

Принцип неопределенности джаваскрипта

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 не переопределяется.

Предупреждение: Будьте бдительны! Строгий режим на то и строгий, чтобы бить по рукам за каждую оплошность.

Ссылки по теме:

blog comments powered by Disqus