2009-01-27 7 views
2

Pourquoi 'moi' et 'ceci' sont-ils indéfinis quand setTimeout appelle le callback anonyme?Javascript 'this' Problème

var gMyObj = new MyObj(); 
    gMyObj.myFunc(); 

    function MyObj() { 
     this.myFunc = function() { 
      var me = this; 
      alert(me.constructor); // defined 
      setTimeout(function(me) { 
         alert(me.constructor); // undefined 
        }, 100); 
     }; 
    } 

Résolution: La réponse sélectionnée est correcte, merci. Ma question était une simplification du vrai problème que j'avais, qui s'est avéré être la façon dont jQuery modifie 'ceci' dans la méthode click() pour qu'il pointe vers l'élément DOM concerné. J'avais créé un nouveau var, 'moi', pour conserver 'ceci', et j'essayais de le passer à la méthode du clic. Tout ce que je devais faire était juste d'utiliser 'moi' à l'intérieur de l'événement click, et laisser la fermeture garder une référence. Passer 'moi' dans click() a échoué, pour la même raison qu'il a échoué dans cet exemple, à savoir que click() ne l'attendait pas.

Répondre

10

Pour cette raison:

function(me) { 

Make it:

function() { 

Et vous êtes bon d'aller.

En ce qui concerne le «pourquoi? En partie, vous définissez une fonction anonyme qui prend un argument appelé me. Lorsque setTimeout() appelle cette fonction, il ne transmet aucun argument, ce qui signifie que me ne sera pas défini. La suppression de me de la liste d'arguments permet de voir le me précédemment défini dans la fonction.

+0

+1. mais moi n'a aucune valeur, indéfini. null est une valeur. – AnthonyWJones