2016-09-01 3 views
0

Wenn die folgende foo Funktion mit new aufgerufen wird, wird es in eine Konstruktorfunktion, die das Objekt zurückgibt, das zu baz zugewiesen wird.Javascript - Funktionskonstruktor mit neuem Schlüsselwort

function foo() { 
    this.baz = "baz"; 
    console.log(`${this.bar} ${baz}`); 
} 

var bar = "bar"; 
var baz = new foo(); // prints undefined undefined 

Die Frage ist, warum baz innerhalb der Konsole Anweisung undefined Wert bekommt - es wäre das richtig sein, zu sagen, während baz gehisst wurde, wenn neue foo() aufgerufen wird, bis die Funktion der baz kehrt die nicht zugeordnet zurückgegebenes Objekt?

console.log(baz) in einer späteren Zeile druckt das zurückgegebene Objekt korrekt.

Antwort

1

Die Variable baz existiert nicht zum Zeitpunkt der Ausführung des Konstruktors. baz wird erstellt, nachdem der Konstruktor ausgeführt wurde.

Es würde in ähnlicher Weise funktionieren, wenn Sie eine IIFE verwendet:

var test = (function() { 
    console.log(test) // undefined 
    return 'test' 
}()) 
console.log(test) // 'test' 
2

In der Funktion gibt es keine bar in der this. Sie müssen den this Teil des this.bar entfernen. Für baz müssen Sie die this.baz verwenden, da sie an die Objektinstanz angefügt ist.

function foo() { 
 
    this.baz = "baz"; 
 
    console.log(`${bar} ${this.baz}`); 
 
} 
 

 
var bar = "bar"; 
 
var baz = new foo();

Dieser Code bedeutet

this.baz = "baz"; 
console.log(`${this.bar} ${baz}`); 

, dass, wenn Sie ein Objekt erstellen, es nur baz darin haben wird. Wenn Sie im Objekt auf die Objekteigenschaft zugreifen möchten, müssen Sie auf this zugreifen. ${baz} ist undefiniert, weil es keine baz Variable gibt (es wird nicht in der this aussehen) .So wenn Sie auf die baz in der Funktion zugreifen müssen, müssen Sie this.baz verwenden.

was ${this.bar}, gibt es keine bar Eigenschaft im this, nur baz.

+0

Ihre Antwort geht davon aus, der Code muss behoben werden. nicht auf der Suche nach einer Lösung, sondern Bestätigung der Erklärung für das Verhalten. – user3206440

0

MDN link wird Ihnen helfen, zu verstehen, was this Mittel.

Wird innerhalb einer Funktion verwendet und bezieht sich auf das aktuelle Objekt. Was das tatsächlich bedeutet, wird durch die Art und Weise angegeben, in der Sie diese Funktion aufgerufen haben. Wenn Sie es mit Punktnotation oder Klammernotation auf ein Objekt aufgerufen haben, wird dieses Objekt dies. Wenn die Punktnotation für den Aufruf nicht verwendet wurde, bezieht sich dies auf das globale Objekt.

Sie rufen also this.bar innerhalb von function foo(). Sie erhalten undefined, weil die Funktion foo() keine bar Eigenschaft besitzt.

Auch wenn Sie nur bar innerhalb von function foo() aufrufen, wird es beginnt, bar Eigenschaft zu finden.
Zuerst innerhalb function foo() und suchen Sie es, wenn global Bar Eigenschaft hat.

Verwandte Themen