2009-07-07 20 views
8

ich einen JavaScript-Namespace habe sagenAufruf Methode innerhalb einer anderen Methode in Javascript?

A={ 

    CA: function() { 
    this.B(); 
    }, 
    B: function() { 
    var test='test'; 
    var result='t1'; 

    C: function() { 
     this.test='test1'; 
     ..... 
     ..... 
     return 'test1';  
    } 

    result=this.C(); 
    return result; 
    } 
} 

Nun, wenn ich einen solchen Code bin Ausführung wird es geben, dass Typeerror: this.C keine Funktion ist. Kann mir jemand sagen, warum es so ist? Ich weiß, dass es etwas mit lexikalischem Scoping zu tun hat, aber ich kann das nicht verstehen.

+0

Sorry, ich bin ein neuer Benutzer und schrieb die erste Frage, weiß nicht, wie man Fragen stellt. Ich werde dies jetzt weiter beachten. Vielen Dank. –

Antwort

5

Ich denke, das Problem ist, dass, wenn this.C() innerhalb der Funktion, die von B bezeichnet ausgeführt wird, this auf das Objekt bezieht, das B enthält, das heißt, A Objekt. (Dies setzt voraus, B() im Rahmen der A genannt wird)

Das Problem ist, C existiert nicht auf dem Objekt A, da es innerhalb B definiert ist. Wenn Sie eine lokale Funktion C() innerhalb B aufrufen möchten, verwenden Sie einfach C().

EDIT: Auch ich bin mir nicht sicher, was Sie geschrieben haben, ist gültige JavaScript. Insbesondere sollte B auf diese Weise definiert werden, da Sie die Objekt: Eigenschaftssyntax innerhalb einer Funktion nicht verwenden können.

B: function() 
{ 
    var test='test'; 
    var result='t1'; 

    var C = function() 
    { 
    this.test='test1'; 
    return 'test1';  
    } 

result=C(); 
return result; 
} 
+0

Ich denke, Sie haben Recht, und ich habe auch den gleichen Weg schließlich (machte die Funktion und nannte es direkt von der äußeren Funktion) nach dem schlagen meinen Kopf, um dies zu machen. –

4

Ich bin tatsächlich überrascht, dass Ihr Code Ihnen keinen Fehler auf der 'C:' Zeile gibt.

Wie auch immer, Ihre Syntax zum Definieren einer Funktion ist nicht korrekt. Definieren Sie es mit dem Schlüsselwort var. Beachten Sie auch, dass ich die 'Schließung' erstellt habe, damit die Funktion C auf 'diese' zugreifen kann. Sehen Sie den Code unten:

A={ 

    CA: function() 
    { 
    this.B(); 
    }, 

    B: function() 
    { 
    var test='test'; 
    var result='t1'; 

    var self = this; 
    var C = function() 
      { 
       self.test='test1'; 
       ..... 
       ..... 
       return 'test1';  
      } 

    result=C(); 
    return result; 
    } 
} 

Wenn Sie C zu ‚diesem‘ Objekt zuweisen möchten, können Sie auch tun:

A={ 

    CA: function() 
    { 
    this.B(); 
    }, 

    B: function() 
    { 
    var test='test'; 
    var result='t1'; 

    var self = this; 
    this.C = function() 
      { 
       self.test='test1'; 
       ..... 
       ..... 
       return 'test1';  
      }; 

    result= this.C(); 
    return result; 
    } 
} 
+0

Sie können "this" nicht verwenden, da "this" ein Schlüsselwort ist und Sie den Abschluss erstellen müssen. Da ich das 'self' als lokale Variable definiere, wird es sich auch nicht auf das globale Objekt auswirken. – SolutionYogi

+0

yeah Entschuldigung, ich realisierte meine Stummheit und löschte daher meinen Kommentar :-(Aber ja, jetzt stimme ich deiner Antwort zu. +1 dafür, dass du mich auch vertraust :-) –

21

Sie müssen vorsichtig sein, wenn Sie diese verwenden, etwas zu identifizieren in Javascript, weil jedes Mal, wenn Sie den Bereich "dieses" ändern.

Das Zuweisen des 'this' Verweises auf seine eigene Variable hilft dabei.

var a = new function() { 
    var self = this; 

    self.method = function() { alert('hiya'); }; 

    var b = function() { 
     this.method(); // this isn't 'a' anymore? 
     self.method(); // but 'self' is still referring to 'a' 
    }; 

}; 
+1

var self = this; ist genau das, was ich gesucht habe! Vielen Dank! –

+0

Genau das habe ich gebraucht, vielen Dank. –

0

Lösung zum Aufrufen von Methoden von einer anderen Methode. (Im Wesentlichen der Zeiger „this“ muß statt dessen verwendet, um eine Variable, und der neuen Variablen zugewiesen werden.)

function myfunction(){ 
    var me = this; 

    me.method1 = function(msg){ alert(msg); } 

    me.method2 = function(){ 
     me.method1("method1 called from method2"); 
    } 
} 

var f as new myfunction(); 
f.method2(); 

Dieses Beispiel zeigt, wie man ein Verfahren, aus einer anderen Methode aufrufen kann, oder von der Außenseite einer Instanz unter Verwendung von der Funktion.

Verwandte Themen