2009-07-13 6 views
-2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
     <title>test</title> 

    </head> 
    <body> 
     <script type="text/javascript" charset="utf-8"> 
      (function(){ 
       // this 
       var test=function(){ 
        //this 
        return function(){ 
         //this 
        }; 
       } 

       (function(){ 
        //this 
        var a={ 
         p1:function(){ 
          //this 
         } 
        }; 
       })(); 
      })(); 
     </script>  
    </body> 
</html> 
+5

Bitte beachten Sie, enthalten Javascript weniger einfach sein, als angekündigt. Geschäftsbedingungen gelten. Das Angebot ist in Kanada nicht gültig. – Greg

+2

Kopieren Sie einfach Code einfügen nicht eine gute Frage. -1 – Boldewyn

Antwort

13

David Dorward bereits über JavaScript: The Good Parts von Douglas Crockford erwähnt.

Aus Abschnitt 4.3 des ausgezeichneten Buch:

Aufruf einer Funktion unterbricht die Ausführung der aktuellen Funktion, vorbei Steuerung und Parameter an die neue Funktion. Zusätzlich zu den deklarierten Parametern erhält jede Funktion zwei zusätzliche Parameter: Dies und Argumente. Der Parameter ist in der objektorientierten Programmierung sehr wichtig, und sein Wert ist , bestimmt durch das Aufrufmuster. Es gibt vier Mustern von Aufruf in JavaScript: die Methodenaufruf Muster, die Funktionsaufruf Muster, der Konstruktor Invokation Muster und der Aufruf gelten Muster. Die Muster unterscheiden sich darin, wie der Bonus-Parameter initialisiert wird.

Crockford weiterhin die Bindung von ‚this‘ in jedem dieser Muster wird erläutert, wie folgt:

Die Method Invocation Muster: Wenn eine Funktion als eine Eigenschaft eines Objekts gespeichert ist, nennen wir es ist eine Methode. Wenn eine Methode aufgerufen wird, ist diese an das Objekt gebunden.

Das Funktionsaufrufmuster: Wenn eine Funktion mit diesem Muster aufgerufen wird, ist diese an das globale Objekt gebunden. Dies war ein Fehler in der Gestaltung der Sprache.

Der Constructor Invocation Muster: Wenn eine Funktion mit dem neuen Präfix aufgerufen, dann wird ein neues Objekt mit einem versteckten Link auf den Wert der Funktion des Prototyps Mitglieds erstellt werden, und dies wird zu diesem neuen Objekt gebunden werden .

Das Apply-Aufrufmuster: Mit der Methode apply können wir ein Array von Argumenten erstellen, die zum Aufrufen einer Funktion verwendet werden. Es lässt uns auch den Wert davon wählen. Die Methode apply benötigt zwei Parameter. Der erste ist der Wert, der daran gebunden sein sollte. Die zweite ist ein Array von Parametern.

+0

nichts über das "Aufruf" -Aufrufmuster ('fn.call (context, arg1, arg2, ... argn)')? –

+1

@ gion_13, in Bezug auf "this" entspricht es dem "Apply Invocation Pattern", [siehe eine ähnliche Antwort] (http://stackoverflow.com/a/1986909/562906) – sinelaw

1

andere als this ist ein Kommentar

In gewissem Sinne Umfang Kette aus den this in der unteren Funktion des ganzen Weg zurück zum globalen this bewegen.

zB die dies in

p1:function(){ 
     //this 
    } 

dann die dieser über ihm

(function(){ 
    //this 
    var a={ 
    p1:function() 

Dann die this darüber

(function(){ 
    // this 
    var test=function(){ 

Es gibt eine gute Präsentation von Nicholas Zakas bei Yahoo auf es bei http://www.youtube.com/watch?v=mHtdZgou0qU

4

Die Bedeutung von this hängt davon ab, wie die Funktion, die es enthielt genannt wurde, nicht wie es war konstruiert.

Es gibt eine hervorragende Erklärung, wie es in JavaScript: The Good Parts funktioniert.

Die kurze Version ist, dass, wenn Sie eine Funktion (m) als Methode eines Objekts (o) aufrufen, thiso ist.

var o = { 
    m: function() { 
     return this; 
    } 
} 

var foo = { 
    bar: o.m; 
} 

o === o.m(); 
foo === foo.bar(); 
0

Es ist am besten, Javascript-Schließungen zu betrachten, um Bereiche und die Zeigerzuordnung zu verstehen. "this" ist schon vor der objektorientierten Programmierung entstanden, ist aber dafür unbedingt notwendig.

http://jibbering.com/faq/notes/closures/

Diese Kennung Auflösung hängt stark von der Rolle der Umfang Ketten und so auf die Auflösung von Eigenschaftsnamen auf Objekte.

Die einfache Erklärung einer Schließung ist, dass ECMAScript interne Funktionen ermöglicht; Funktionsdefinitionen und Funktionsausdrücke, die innerhalb der Funktionsblöcke anderer Funktionen sind.


Die Eigenschaften auf dem Variable-Objekt erstellt, das mit deklarierten lokalen Variablen entspricht, werden zunächst undefinierte Werte während Variable Instanziierung, die tatsächliche Initialisierung der lokalen Variablen nicht geschehen, bis die Auswertung der zugewiesenen entsprechende Zuweisungsausdrücke während der Ausführung des Funktionskörpercodes.

Es ist die Tatsache, dass das Freigabeobjekt, mit seinen Argumenten Eigenschaft, und das Variable-Objekt mit dem Namen Eigenschaft mit Funktion lokalen Variablen entspricht, ist das gleiche Objekt, dass die Kennung Argumente erlaubt behandelt werden, als ob es war eine lokale Funktion Variable.

Schließlich wird ein Wert für die Verwendung mit diesem Schlüsselwort zugewiesen. Wenn der zugewiesene Wert sich auf ein Objekt bezieht, dann werden den Eigenschaften-Zugriffsmethoden vorangestellt, wobei das Schlüsselwort this auf die Eigenschaften dieses Objekts verweist. Wenn der Wert (intern) null ist, verweist das Schlüsselwort this auf das globale Objekt .

Der globale Ausführungskontext wird leicht unterschiedlich gehandhabt, da keine Argumente enthält, so dass kein definiertes Aktivierungsobjekt benötigt wird, um auf sie zu verweisen. Der globale Ausführungskontext benötigt einen Gültigkeitsbereich und seine Geltungsbereichskette besteht aus genau einem Objekt, dem globalen Objekt .Der globale Ausführungskontext durchläuft die Variable Instantiierung, seine inneren Funktionen sind die normale Funktion der obersten Ebene Deklarationen, die den Großteil des JavaScript-Codes ausmachen. Das globale Objekt wird als Variablenobjekt verwendet, weshalb global deklarierte -Funktionen Eigenschaften des globalen Objekts werden. Ebenso global deklarierte Variablen. Der globale Ausführungskontext verwendet für dieses Objekt auch einen Verweis auf das globale Objekt . mit freundlicher Genehmigung von http://jibbering.com/faq/notes/closures/ Kapitel: Identifier Auflösung, Ausführung Contexts und Umfang Ketten