6
votes

La variable de fonction d'instance n'est pas modifiée?

J'ai essayé de consoler la variable Fullname après la fonction de fonction, mais il n'a pas changé de valeur, il suffit de consoler la valeur par défaut non défini , pourquoi? XXX


3 Réponses :


3
votes

C'est parce que lorsque les rappels sont appelés, le contexte ( cette code>) du rappel n'est pas le ClientData ​​code> objet.

Vous pouvez définir le manuel de rappel En utilisant fonction.bind () p >

p>

<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>


2 commentaires

Expliquez un peu sur .bind () .. + 1


Une fonction ceci n'est qu'un paramètre de son contexte d'exécution, ce n'est pas le contexte . Le problème de l'OP est que le rappel ceci n'est pas défini sur la bonne valeur, de sorte que c'est ce qui doit être corrigé (par liaison, une fermeture ou une modification de l'appel).



3
votes

Cela fonctionne. Vous pouvez le faire sans utiliser la fonction BIND (). Il vous suffit de stocker l'objet de test dans la variable.

p>

function Test() {
 var t = this
 this.clientData = {
          fullName : "Not Set",
          setUserName: function (firstName, lastName) {
          t.clientData.fullName = firstName + " " + lastName;
          },
          getUserInput2: function (firstName, lastName, callback) {
              callback(firstName, lastName);
          }
       };
 this.getUserInput1 = function (firstName, lastName, callback) {
     callback(firstName, lastName);
       };
 }

var test = new Test();
test.getUserInput1("A1", "B1", test.clientData.setUserName);
console.log("test.clientData.fullName : " + test.clientData.fullName);//Not Set
//expected => A1 B1
test.clientData.getUserInput2("A2", "B2", test.clientData.setUserName);
console.log("test.clientData.fullName : " + test.clientData.fullName);//Not Set
   


1 commentaires

Je pense que vous voulez que ce soit var t = ceci;



3
votes

Pour comprendre clairement la relève code> code>, vous devez comprendre qu'il représente la "portée" actuelle à l'intérieur de la fonction.

Lorsque vous déclarez: P>

function Person() {
    var self = this;
    self.fullName = "Not Set"
    self.setFullName = function(firstName, lastName) {
        self.fullName = firstName + " " + lastName; 
    };
}
var john = new Person();
john.setFullName("John", "Doe");
console.log("john.fullName : " + john.fullName); // Display : John Doe
var bruce = new Person()
bruce.setFullName("Bruce", "Wayne");
console.log("bruce.fullName : " + bruce.fullName); // Display : Bruce Wayne


0 commentaires