10

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.

Dagg Nabbit
  • 75,346
  • 19
  • 113
  • 141

1 Answers1

6

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.
Community
  • 1
  • 1
Rob W
  • 341,306
  • 83
  • 791
  • 678
  • Well, that certainly explains it. I wonder how this bug managed to crop up in three different UAs. – Dagg Nabbit Mar 13 '12 at 14:49
  • 2
    @GGG The [original version of the standard](http://wiki.ecmascript.org/lib/exe/fetch.php?id=es3.1%3Aes3.1_proposal_working_draft&cache=cache&media=es3.1:tc39-2009-050.pdf) did not define this behaviour. It was corrected [later](http://wiki.ecmascript.org/lib/exe/fetch.php?id=es3.1%3Aes3.1_proposal_working_draft&cache=cache&media=resources:es5_errata_7-31-10.pdf) (10.5 5.e.) – user123444555621 Mar 13 '12 at 15:23
  • 1
    FWIW, this is where the errata originated from: https://mail.mozilla.org/pipermail/es5-discuss/2011-January/003882.html – user123444555621 Mar 13 '12 at 16:47
  • 1
    @GGG The bug has been marked as [**fixed**](http://code.google.com/p/chromium/issues/detail?id=115452#hc4), and will be added into Chrome next week. – Rob W Mar 14 '12 at 16:05