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

Dag*_*bit 10 javascript function global-variables propertydescriptor ecmascript-5

像这样设置属性描述符:

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

......据我所知,应该使不可写的someFunction财产window.它适用于我期望的函数表达式,无论函数是否直接赋值给对象属性... 小提琴

window.someFunction = function() { alert('boom!'); }
someFunction(); // safe
Run Code Online (Sandbox Code Playgroud)

...或分配给全局变量:小提琴

var someFunction = function() { alert('boom!'); }
someFunction(); // safe
Run Code Online (Sandbox Code Playgroud)

但是,它似乎不适用于函数声明:小提琴

function someFunction() { alert('boom!'); }
someFunction(); // boom!
Run Code Online (Sandbox Code Playgroud)

这种行为是故意的吗?它背后的原因是什么?这记录在哪里?或者我只是犯了一些愚蠢的错误?


顺便说一句,我正在使用Chromium 17来测试它.严格模式似乎没有任何区别.

Rob*_*b W 6

这是一个错误(参见Bug#115452),我在回答这个问题时也遇到了这个问题.

兼容性检查:测试用例

  • 在Firefox 4+中,它工作正常.
  • 在Chrome 16中,它运行正常.
  • 在Chrome 17中,它不起作用.
  • IE8-没有Object.defineProperty,所以它不起作用
  • 在IE9中,它不起作用.
  • 在Safari 5中,它不起作用.

  • @GGG [标准的原始版本](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)没有定义这种行为.它已被纠正[稍后](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.) (2认同)