2010-07-06 6 views
4

Je l'objet javascript suivant, un peu pseudocode:Javascript emboîtées Fonctions Portée

{ 
    dateField: new Date(), 
    addMinutes:function(numMinutes) 
    { 
    CallWebService(numMinutes, function{alert(this.dateField; }); 
    } 
} 

Le problème est la portée de la fonction de rappel dans CallWebService ne voit pas la propriété dateField de l'objet. Est-ce que je peux y accéder? Merci!

Répondre

8

Vous devez préserver le contexte (la valeur this) de la fonction addMinutes.

Il existe plusieurs moyens pour y parvenir, le plus facile un est de stocker simplement une référence de this sur une variable, cette variable sera disponible à la portée de la fonction de rappel, par exemple:

var obj = { 
    dateField: new Date(), 
    addMinutes: function(numMinutes) { 
    var instance = this; 
    CallWebService(numMinutes, function() { 
     alert(instance.dateField); 
    }); 
    } 
}; 
+0

Exactement ce dont j'avais besoin. Merci! – extnoob

0

Le problème est que le rappel est susceptible de définir la portée de la fonction de rappel, si vous utilisez apply ou appel, vous pouvez forcer la portée. Vous pouvez le faire avec quelque chose comme ceci:

{ 
    dateField: new Date(), 
    addMinutes: function (numMinutes) { 
     var self = this; 
     var success = function() { 
      alert(this.dateField;); 
     }; 
     CallWebService(numMinutes, function() { success.apply(self); }); 
    } 
} 
0

Vous pouvez accéder à n'importe quelle propriété (ie variable ou fonction) d'un objet à l'intérieur de cette portée d'objet en utilisant l'opérateur point (.). Vous pouvez donc utiliser comme ceci:

 
var obj = { 
    dateField: new Date(), 
    addMinutes: function(numMinutes) { 
    callWebService(numMinutes, function() { 
     alert(obj.dateField); 
    }); 
    } 
} 

Ici variable « dateField » de l'objet « obj » est accessible à l'intérieur que la portée d'objet à l'aide de l'opérateur point comme « obj.dateField ». Je pense que cela vous aidera à résoudre votre problème, laissez-moi savoir si vous n'êtes pas clair avec le code ci-dessus.