2010-06-25 5 views

Antwort

17

Für globalen Code (Code, der nicht Teil irgendeine Funktion ist), sie sind fast gleichwertig, beide am Ende erstellen Eigenschaft auf dem globalen Objekt.

Der Unterschied besteht darin, dass a, die mit der var Anweisung erklärt wurden, der Variable Instantiation Prozess(1), das globale Objekt als Variable Objekt verwendet, und es wird die Eigenschaft als nicht löschbar definieren on es, zum Beispiel:

var a = 13; 
delete a; // false 
typeof a; // "number" 

Dann b da der this Wert im globalen Code, auf das globale Objekt verweist selbst, wird auch eine globale Eigenschaft, aber diese kann gelöscht werden:

this.b = 21; 
delete b; // true 
typeof b; // "undefined" 

Sie den ersten Schnipsel in Firebug nicht versuchen, da die Konsole des Firebug den Code intern mit eval läuft, und in diesem Ausführungskontext die Variable Instanziierung Prozess anders verhält, können Sie es here versuchen.

(1) Die Variable Object (VO) ist ein Objekt, das durch die Variable Instanziierung Verfahren verwendet wird, die Kennungen von FunctionDeclarations, Kennungen mit den var Anweisungen und Kennungen der Funktions formaler Parameter erklärt zu definieren, in dem verschiedene execution contexts, alle diese Kennungen sind als Eigenschaften der VO gebunden, die Scope-Kette besteht aus einer Liste von VOs.

Für globalen Code ist das VO das globale Objekt selbst, deshalb ist a eine Eigenschaft davon. Für Funktionscode, der VO (auch bekannt als Activation Object für FunctionCode), ist ein neues Objekt hinter den Kulissen erstellt, wenn Sie eine Funktion aufrufen, und das ist, was einen neuen lexikalischen Bereich erstellt, in Kürze werde ich darüber sprechen Funktionen.

Sowohl a und this.b können resolved einfach sein, wie durch a und b, weil das erste Objekt in dem Scope-Chain, wieder ist das globale Objekt.

Außerdem glaube ich, ist zu wissen, dass die Arbeit Variable Instanziierung Prozess stattfindet vor als die Ausführung von Code, zum Beispiel:

alert(a); // undefined, it exists but has no value assigned to it yet 
alert(b); // ReferenceError is thrown 

var a = 13; 
this.b = 21; 

Diese Unterschiede trivial sein können, aber ich denke, wert ist, sie zu kennen.

Nun, wenn das Code-Snippet, das Sie gepostet haben, innerhalb einer Funktion ist, ist es völlig anders.

Die a Kennung, erklärt der var Aussage in Ihrem Beispiel wird nur auf die lexikalischen Gültigkeitsbereich der Funktion (und alle verschachtelten Funktionen) eine lokale Variable, zur Verfügung stehen.

Beachten Sie, dass in JavaScript-Blöcke keinen neuen Rahmen einführen, nur Funktionen zu tun, und eine Variable in diesem Umfang zu erklären, sollten Sie immer Verwendung var.

Die this.b Kennung wird eine Eigenschaft an das Objekt gebunden werden, die durch den this Wert bezeichnet wird, aber ... Was ist this ???.

Der this Wert in JavaScript implizit gesetzt, wenn Sie eine Funktion aufrufen, es wird dadurch bestimmt, wie rufe Sie es:

  1. Wenn Sie den new Operator verwenden, die this Wert innerhalb der Funktion, wird Punkt zu einem neu erstellten Objekt, zB:

    function Test() { 
        this.foo = "bar"; 
    } 
    var obj = new Test(); // a new object with a `foo` property 
    
  2. Wenn Sie eine Funktion aufrufen, die Mitglied eines Objekts, das this Wert innerhalb dieser Funktion wird dem Basis Objekt zeigen, zB:

    var obj = { 
        foo: function() { 
        return this == obj; 
        } 
    }; 
    obj.foo(); // true 
    
  3. Wenn Sie eine Funktion ohne Basisobjekt aufrufen, die this Wert auf das globale Objekt beziehen:

    function test() { 
        return this == window; 
    } 
    test(); // true 
    
  4. Der this Wert kann explizit festgelegt werden, wenn Sie eine Funktion mit call oder apply aufrufen:

    function test() { 
        alert(this); 
    } 
    test.call("hello world!"); // alerts "hello world!" 
    
+0

+1 Gerade für diese klare Erklärung, überprüfte ich dein Profil zu sehen, wenn Sie einen Blog hatte, dass ich :) – Konerak

+0

+1 für volle sehr nette Antwort lesen konnte –

+0

+ 1 für eine gute Erklärung, aber Ihre erste Zeile ist etwas ungenau: eine globale Variable ist nicht das gleiche wie eine Eigenschaft des globalen Objekts, wie Sie dann weiter zu zeigen. Das Deklarieren einer Variablen mit 'var' im globalen Gültigkeitsbereich erzeugt eine Eigenschaft des globalen Objekts als * Nebeneffekt * der Tatsache, dass das globale Objekt als Variablenobjekt im globalen Gültigkeitsbereich verwendet wird. –

1

kurz zu verstehen, wenn Sie diese in einer Funktion verwenden dann -

this.a; //will create a public property 

var b; //will create a member variable 

z.B. hier ist eine Student-Klasse in Javascript

var Student = function() 
{ 
    // Member variable 
    var studentId; 

    // Public property 
    this.Name = ""; 
} 

für mehr - Siehe Object Oriented Programming with JavaScript

+0

Dang, schlug mich nur um 5 Sekunden –

Verwandte Themen