Dans les réponses à this question, nous lisons que function f() {}
définit le nom localement, tandis que [var] f = function() {}
le définit globalement. Cela me semble logique, mais il y a un comportement étrange qui est différent entre les deux déclarations.JavaScript: Comment "function onload() {}" est-il différent de "onload = function() {}"?
J'ai fait une page HTML avec le script
onload = function() {
alert("hello");
}
et cela a fonctionné comme prévu. Quand je l'ai changé à
function onload() {
alert("hello");
}
rien ne s'est passé. (Firefox a quand même déclenché l'événement, mais pas WebKit, Opera et Internet Explorer, bien que franchement je n'ai aucune idée de ce qui est correct.)
Dans les deux cas (dans tous les navigateurs), j'ai pu vérifier que les deux window.onload
et onload
ont été mis à la fonction. Dans les deux cas, l'objet global this
est défini sur la fenêtre, et peu importe comment j'écris la déclaration, l'objet window
reçoit la propriété très bien.
Que se passe-t-il ici? Pourquoi une déclaration fonctionne-t-elle différemment de l'autre? Est-ce une bizarrerie du langage JavaScript, du DOM ou de l'interaction entre les deux?
Je commence à soupçonner que c'est un bug dans Webkit/Opera et que Firefox a le bon comportement. – Wogan
Ni l'un ni l'autre n'est correct en soi. L'objet global (auquel se réfère 'window') peut avoir des propriétés définies par l'hôte (telles que' onload') et une implémentation ECMAScript 3 est libre d'implémenter le comportement d'une telle propriété comme il le souhaite, y compris l'interne '[[Put ]] 'méthode appelée lorsque la valeur de la propriété est affectée. –
Dans Firefox 3.5.5, je vois l'alerte si j'utilise 'onload = function() {...};' mais pas avec 'var onload = function() {...};' –