Pourquoi une déclaration de fonction override non inscriptible propriétés de l'objet global?
-
13-12-2019 - |
Question
La fixation d'un descripteur de propriété comme ceci:
Object.defineProperty(window, 'someFunction', {
value: function() { alert('safe'); },
writable: false,
enumerable: false,
configurable: false
});
...devrait, autant que je sache, faire de la someFunction
propriété de window
non accessible en écriture.Il travaille pour les expressions de fonction comme je l'attends, si la fonction est directement affectée à la propriété de l'objet... violon
window.someFunction = function() { alert('boom!'); }
someFunction(); // safe
...ou assignée à une variable globale: violon
var someFunction = function() { alert('boom!'); }
someFunction(); // safe
Cependant, il ne semble pas fonctionner avec les déclarations de fonction: violon
function someFunction() { alert('boom!'); }
someFunction(); // boom!
Est-ce un comportement intentionnel?Quel est le raisonnement derrière cela?Est-ce documenté nulle part?Ou suis-je juste une sorte de stupide erreur?
En passant, je suis en utilisant Chrome 17 pour tester cela.Le mode Strict ne semble pas faire de différence.
La solution
C'est un bug (voir le Bogue #115452), que j'ai également rencontrés lors de la réponse cette question.
Vérification de la compatibilité: Cas de Test
- Dans Firefox 4+, il fonctionne très bien.
- Dans google Chrome 16, il fonctionne très bien.
- Dans Chrome 17, il ne fonctionne pas.
- IE8 - n'a pas
Object.defineProperty
, de sorte qu'il ne fonctionne pas - Dans IE9, il ne fonctionne pas.
- Dans Safari 5, il ne fonctionne pas.