2017-05-12 3 views
-1

Wenn ich diesen Code ausführen
Scope in Javascript-Objekte

f= function(){ 
    let test= "hello"; 
    let ret={ 
    "test": "world", 
    "func": function(){ 
      console.log(test); 
     } 
    } 
    return ret; 
} 

let check= f(); 

check.func() 

I-Ausgang als "Hallo" zu bekommen. Aber ich kann nicht herausfinden, warum es passiert. Nach dem, was ich gelesen habe, wird die Scope-Kette während der Definition übereinander gestapelt und der letzte Block des Scope wird zur Laufzeit an sie angehängt. Sollte also die Scope-Kette nicht global sein -> Funktion f -> ret Object -> Funktionstest? Warum werden die Mitglieder von ret-Objekt aus der Scope-Kette ausgeschlossen? Ist es so etwas wie Mitglieder eines Objekts, die nicht an den Bereich gebunden sind und nur Teil des Kontexts sind?

+0

Es gibt einen Unterschied zwischen 'this.test' und der Variablen' test'. Es gibt nur einen von letzterem, und er hält "Hallo". – deceze

+1

Objekte erstellen keinen Bereich, nur * Funktionen tun dies. – zerkms

+0

@zerkms So Objekt-Mitglieder werden nie Teil des Bereichs sein. Sie können nur einen Kontext erstellen. Korrigiere mich, wenn ich falsch liege. – krrish

Antwort

0

console.log(this.test) oder console.log(ret.test) sollte Ausgabe als "Welt" geben.

Wie @deceze sagte, müssen Sie den Unterschied zwischen this.test und test verstehen.

this.test ist Objekteigenschaft und test ist eine Variable, keine Objekteigenschaft.

0

Die Frage war zu dumm und es gibt bereits Antworten, aber ich möchte immer noch erklären, was ich falsch gemacht habe, um Anfängern wie mir zu helfen.
Tatsächlich behandelte der Artikel, den ich las, die Begriffe Kontext und Umfang auf die gleiche Weise. Und ich habe versucht, Objekt-Mitglieder auf dem Scope-Stack anzuhängen, das passiert nicht. Grundsätzlich ist der Umfang funktionsbasiert und der Kontext ist objektbasiert. Jeder Aufruf hat sowohl Geltungsbereich als auch Kontext, aber sie sind nicht gleich. Also wird this.test "world" geben, da der Kontext auf ret object gesetzt ist und ret.test "world" gibt, weil Javascript die zirkuläre Abhängigkeit selbst auflöst.
Moral der Story - Umfang und Kontext sind nicht gleich. Benutze es nicht austauschbar.
This Post ist nützlich, wenn jemand wie ich verwirrt wurde.