为什么函数声明会覆盖全局对象的不可写属性?

时间:2012-03-13 14:26:58

标签: javascript function global-variables ecmascript-5 propertydescriptor

像这样设置属性描述符:

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 个答案:

答案 0 :(得分:6)

这是一个错误(see Bug #115452),我在回答this question时也遇到了这个错误。

兼容性检查:Test case

  • 在Firefox 4+中,它运行正常。
  • 在Chrome 16中,它运行正常。
  • 在Chrome 17中,它不起作用。
  • IE8-没有Object.defineProperty,因此无效
  • 在IE9中,它不起作用。
  • 在Safari 5中,它不起作用。