2010-02-14 6 views
3

En utilisant le bit de code suivant:ce que cela se réfère à une méthode privée javascript

function Node(){ 
.... 
function foo(request){ 
     for (var name in this) { 
      log(name +" is "+this[name]); 
      if(!(name == 'all' || typeof this[name] == 'function')){ 
       request[name] = this[name]; 
      } 
     } 
     return ... 
    }; 
} 

J'ai été surpris que lorsque la fonction est appelée privée foothis ne semble pas se référer à l'objet contenant (une instance de Node). Pourquoi donc ?

Bien sûr, je pourrais avoir quelque chose comme:

function Node(){ 
     var ref = this; 
     .... 
} 

et utilise ref comme this dans foo, mais est-il un moyen de déclarer des méthodes privées pour lesquelles this est une référence à l'objet contenant?

Répondre

1

'this' fait référence à l'objet utilisé pour appeler la fonction, qui par défaut est 'window'. Utilisez foo.apply (this, ...) ou foo.call (this, ...) pour appeler foo de telle sorte que 'this' dans foo fasse référence à 'this' qui s'appelle foo.

La convention que j'utilise (pour éviter .Appliquer et .call) est:

var me = this; 

function foo() 
{ 
    // use 'me' 
} 

BTW, 'Me' est le mot-clé 'ceci' dans VB.NET.

+0

"'ceci' fait référence à l'objet utilisé pour appeler la fonction", mais j'ai appelé foo depuis une fonction publique dans Node (this.publicFoo = function() {... foo(); ...};) . Comment se fait-il alors que cela se réfère toujours à la fenêtre? Cheers –

+0

'ceci' fait référence à l'objet sur le côté gauche du "." quand une méthode est appelée. Mais si appelé sans "." (par exemple, foo();) alors cela implique window.foo(); Peu importe où il est défini, mais comment il est appelé. –

0

l'implémentation de 'this' était incorrecte mais n'était pas 'fixed' entraînant toute la confusion et les solutions de contournement.

votre var ref=this; est exactement comment vous maintenez une référence à votre objet pour une utilisation dans ses membres publics/Priviledged. Douglas Crockford (google it) utilise var that=this;.

Questions connexes