Почему объявление функции переопределяет неписанные свойства глобального объекта?

Установка дескриптора свойства следующим образом:

Object.defineProperty(window, 'someFunction', {
    value: function() { alert('safe'); },
    writable: false,
    enumerable: false,
    configurable: false
});

... должен, насколько мне известно, сделать свойство someFunction window недоступным для записи. Он работает для выражений функций, как я ожидаю, независимо от того, назначена ли функция непосредственно свойству объекта... fiddle

window.someFunction = function() { alert('boom!'); }
someFunction(); // safe

... или присваивается глобальной переменной: fiddle

var someFunction = function() { alert('boom!'); }
someFunction(); // safe

Однако он не работает с объявлениями функций: fiddle

function someFunction() { alert('boom!'); }
someFunction(); // boom!

Является ли это поведение преднамеренным? Каковы причины этого? Является ли это документированным где угодно? Или я просто делаю какую-то глупую ошибку?


Кстати, я использую Chromium 17 для проверки этого. Строгий режим, похоже, не имеет никакого значения.

Ответ 1

Это ошибка (см. Bug # 115452), которую я также встречал при ответе этот вопрос.

Проверка совместимости: Тест-сценарий

  • В Firefox 4+ он отлично работает.
  • В Chrome 16 он работает нормально.
  • В Chrome 17 он не работает.
  • IE8- не имеет Object.defineProperty, поэтому он не работает
  • В IE9 он не работает.
  • В Safari 5 это не работает.