2017-09-25 2 views
0

Ich sah diese "fehlerhafte" Aufruf von new Stichwort auf Promise.resolve, aber ich bin überrascht, dass es funktioniert! Kann mir bitte jemand erklären, was passiert, und ob es in irgendeiner Weise anders ist, das Schlüsselwort new wegzulassen?Stichwort neu auf statische Methode Promise.resolve

new Promise.resolve(1) 

Mit Blick auf die MDN Dokumentationen für operator precedence (speziell Zugang für Mitglieder, Function Call und neu (ohne Argumentliste)) und new keyword, sollte nicht die oben werfen Fehler, da ich nehme an, die Ausdruck wird wie folgt ausgewertet:

new (Promise.resolve(1)) 

Ich glaube, ich vermisse etwas (offensichtlich) hier. Danke im Voraus!

Hinweis: Die Verwendung drossel Bibliothek 2.x

Antwort

1

Here ist eine sehr gute Antwort beschreibt, wie der new-Operator in JavaScript funktioniert.

Im Wesentlichen passiert, dass Promise.resolve als Konstruktor behandelt wird, jedoch wird das konstruierte Objekt verworfen, da Promise.resolve etwas (Ihr Versprechensobjekt) zurückgibt.

In diesem Fall wird die new schadet nicht, da Promise.resolve nicht über den Zugang hängt zu this und, falls Sie es wünschen, kann es einfach entfernt werden.

Umgekehrt wird in sehr seltsame Verhalten new zu einer Instanz Methodenaufruf Hinzufügen führen:

let x = Promise.resolve() 
new x.then(() => console.log("Resolved")) // Will almost certainly throw an error 
+0

"Im Wesentlichen wird Promise.resolve als Konstruktor behandelt" Meinst du, dass der obige Ausdruck wie folgt bewertet wird: 'new (Promise.resolve) (1)'? – jwgoh

+1

In JavaScript ist alles im Kern ein Objekt - also weiß 'new' nicht den Unterschied zwischen 'new Promise()' und 'new X()' (wobei 'X = Promise.resolve' steht). Also ja, während Ihre Klammern den Code sehr merkwürdig aussehen lassen, ist die Bewertungsreihenfolge, die sie implizieren, korrekt. –

1

new ist wirklich nur ein neues Objekt erstellt und ruft die gegebene Funktion mit this Satz auf dieses Objekt. Wenn Promise.resolve intern this überhaupt nicht verwendet, dann macht das keinen Unterschied. Wenn die angegebene Konstruktorfunktion ein Objekt selbst zurückgibt, wird das von new erstellte implizite Objekt verworfen und stattdessen das zurückgegebene Objekt verwendet.

So stellt new ein neues Zwischen Objekt, das hier verworfen wird, da resolve ein Promise zurückkehrt, und es setzt den Kontext zu einem anderen Objekt, das keinen Einfluss zu haben scheint.

+0

Scheint keinen Einfluss _except für Fremdspeicherverbrauch und die Abnahme der Leistung zu haben aufgrund unnötiger Aufwand, der course_ . –

+0

Ich meine * in Funktionalität *. – deceze

+0

Es war keine Kritik an Ihrer Antwort, eher eine Zusicherung an OP, dass "falsch" nicht in Anführungszeichen stehen sollte und dass "es funktioniert" keine Rechtfertigung dafür ist, diese Praxis zu akzeptieren. –

Verwandte Themen