Thursday, May 10, 2012

Why does a function declaration override non-writable properties of the global object?


Setting a property descriptor like this:




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



...should, as far as I know, make the someFunction property of window non-writable. It works for function expressions as I expect, whether the function is directly assigned to the object property... fiddle




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



...or assigned to a global variable: fiddle




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



However, it doesn't seem to work with function declarations : fiddle




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



Is this behavior intentional? What is the reasoning behind it? Is this documented anywhere? Or am I just making some kind of silly mistake?





By the way, I'm using Chromium 17 to test this. Strict mode doesn't seem to make any difference.


Source: Tips4all

1 comment:

  1. This is a bug (see Bug #115452), which I also encountered when answering this question.

    Compatibility check: Test case


    In Firefox 4+, it works fine.
    In Chrome 16, it works fine.
    In Chrome 17, it does not work.
    IE8- doesn't have Object.defineProperty, so it doesn't work
    In IE9, it does not work.
    In Safari 5, it does not work.

    ReplyDelete