2009-06-29 6 views
1

Quelqu'un peut-il me dire comment obtenir un accès à la variable "a" ici:fermeture jQuery et accès aux objets propriété

 
var test = { 
    a: 3, 
    init: function() { 
     $("body").click(function() { 
      alert(a); 
     }); 
    } 
}; 

test.init(); 

Cela ne fonctionne pas non plus: alert (this.a);

Merci d'avance.

Répondre

0

Vous devez vous référer à l'objet:

test.a 
+0

que les couples le code au fait que l'objet global est stocké dans une variable appelée "test". Ce n'est pas un bon motif puisque le test est externe à l'objet. – AnthonyWJones

0

Ajouter une référence auto: -

var test = { 
    a: 3, 
    init: function() { 
     var self = this 
     $("body").click(function() { 
      alert(self.a); 
     }); 
    } 
}; 
+0

Cela fonctionne généralement, mais échouera si: test.init.call (otherContext) – PatrikAkerstrand

+0

@Machine: vrai, mais pourquoi voudriez-vous faire cela? L'accès à des variables en dehors d'un objet peut fonctionner, mais cela entraîne de sérieuses spaggeti. Un tel modèle devrait être considéré comme une mauvaise odeur et évité si possible – AnthonyWJones

+0

Ok, cela fonctionne:

 var test = { a: 3, init: function() { var self = this; $("body").click(function() { test.doit(); }); }, doit: function() { var self = this; alert(self.a); } }; 
mais je dois réutiliser la fonction Doït, maintenant cela ne fonctionne pas:
 var test = { a: 3, init: function() { var self = this; $("body").click(self.doit); }, doit: function() { var self = this; alert(self.a); } }; 
comme « ce "dans doit se réfère à l'objectif $ (" body "). des idées? –

0

Ok, cela fonctionne:

 
var test = { 
    a: 3, 
    init: function() { 
     var self = this; 
     $("body").click(function() { 
      self.doit(); 
     }); 
    }, 

    doit: function() { 
     var self = this; 
     alert(self.a); 
    } 
}; 

mais je dois réutiliser doit fonctionner, alors maintenant cela ne fonctionne pas:

 

var test = { 
    a: 3, 
    init: function() { 
     var self = this; 
     $("body").click(self.doit); 
    }, 

    doit: function() { 
     var self = this; 
     alert(self.a); 
    } 

}; 
0

Ok, cela résout le deuxième problème:

 
function test() { 
    var self; 
    return { 
     init: function() { 
      self = this; 
      $("body").click(this.doit); 
     }, 

     doit: function(data, b) { 
      alert(self.testing()); 
     }, 

     testing: function() { 
      return 4; 
     } 
    } 
} 


$(function() { 
    var x = test(); 
    x.init(); 
}); 

+2

Il pourrait être une idée pour vous de lire le SOFAQ. S'il vous plaît ne continuez pas d'ajouter des réponses comme si SO étaient un forum ou NG. Raffinez simplement votre réponse existante. – AnthonyWJones

2

En fait, je préfère ceci: Il est auto réglage et initialisation:

 

function createX() { 
    var self = { 
     init: function() { 
      $("body").click(this.doit); 
     }, 

     doit: function(data, b) { 
      alert(self.testing()); 
     }, 

     testing: function() { 
      return 4; 
     } 
    } 
    self.init(); 
    return self; 
} 


$(function() { 
    createX(); 
}); 

Questions connexes