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

Установка дескриптора свойства, подобного этому:

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

...должна, насколько я знаю, сделать свойство someFunctionокна недоступным для записи. Он работает для функциональных выражений, как я и ожидал, независимо от того, назначена ли функция непосредственно свойству объекта...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. Строгий режим, кажется, не имеет никакого значения.

10
задан Dagg Nabbit 13 March 2012 в 14:31
поделиться