2010-01-29 8 views
5

Im Grunde versuche ich zu verstehen und lerne das Arbeitsprinzip des 'this' in JavaScript.'Dieses' Schlüsselwort bezieht sich auf welches Objekt innerhalb einer Funktion innerhalb einer anderen Funktion?

Soweit ich verstehe, bezieht sich "dies" auf das Objekt (Funktion), das es in diesem Moment ist.

Also, von diesem Glauben, wollte ich unter den Ausgang des einfachen Code testen:

<body> 

<input type="button" value="Add Age" onclick="Outer()" /> 

<script type="text/javascript"> 

function Outer(){ 

if(typeof this.Father == 'undefined') 
    { 
     this.Father = 0; 
    } 

this.Father+=2; 
alert(this.Father); 

inner(); 

     function inner(){ 
      if(typeof this.Son== 'undefined') 
      { 
       this.Son = 0; 
      }; 

      this.Son++; 
      alert(this.Son); 
      alert(this.Father); 
     }; 
}; 
</script> 
</body> 

Und mir seine Ausgabe verwirrt. Denn in der Funktion inner() gibt this.Son den inkrementierten Ganzzahlwert des Sohns aus. Aber ich erwarte das. Vater scheitert, weil inner() kein .Father-Attribut hat. Aber anstatt eine Ausnahme zu werfen, alarmiert es den Wert von this.Father -Welche scheint

  • eine Zeile über ‚this‘ bezieht sich innere()
  • und folgende Zeile ‚this‘ bezieht sich Outer()

an diesem Punkt habe ich 2 Fragen in meinem Kopf actualy:

  1. Does ‚this‘ Schlüsselwort bezieht sich immer auf das Gehäuse des äußeren Umfang auch in den inneren Funktionen?

  2. Und ohne irgendwelche Instanzen deklariert 'dieses' Schlüsselwort verweist auf was in der Methode? (Ich meine, ohne etwas lik var myFamily = new Outer() mit)

Danke,

burak Ozdogan

Antwort

5

this durch den Aufruf Muster bestimmt wird, das heißt, wie ein Funktionsobjekt aufgerufen wird.

Es gibt 4 verschiedene Arten von Aufrufmuster:

  1. Methodenaufruf: Funktion als eine Eigenschaft eines Objekts definiert ist, und wird über das Objekt unter Verwendung Verfeinerungs genannt, das heißt, ..

    a.func(); // this bezieht sich auf das Objekt, d. H. a.

  2. Funktionsaufruf: einfacher Funktionsaufruf.

    func(); // this ist eine Verbindung zum globalen Objekt.

  3. Konstruktor Aufruf: Nun, es ist ein wenig kompliziert. Da Konstruktoren verwendet werden, wie gut die consturctor-Methode für die neuen Funktionsobjekte new ist, bezieht sich this auf das neue Funktionsobjekt, das gerade erstellt wird.

    var func = neuer Func(); // this bezieht sich auf func während in Func Konstruktor)

  4. Aufruf gelten:

    func.apply (thisArg, argArray); // this ist Bindung an das erste Argument

In anderen Worten, die this in Ihrem Beispiel alle (Ihre onClick Anruf Other()) auf das globale Objekt verweist. Sie sollten stattdessen new Other() verwenden.

+0

Danke, es ist wirklich nützliche Informationen. können Sie mehr über Aufrufmuster in diesem Artikel finden: http://mcarthurgfx.com/blog/article/4-ways-functions-mess-with-this – pencilCake

+0

Und dieses ist auch ziemlich erklärend: Funktionsaufruf in JavaScript - Kontexte erneut besucht - http://msmvps.com/blogs/luisabreu/archive/2009/08/24/funktions-invocation-in-javascript-contexts-revisited.aspx – pencilCake

Verwandte Themen