简体   繁体   中英

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM