Gegeben eine Eingabedatei wie
import { a } from 'b';
function x () {
a()
}
babel wird es kompilieren
'use strict';
var _b = require('b');
function x() {
(0, _b.a)();
}
Beim Kompilieren im Loose-Modus wird der Funktionsaufruf jedoch als ausgegeben _b.a();
Ich habe einige Nachforschungen angestellt, wo der Komma-Operator hinzugefügt wird, in der Hoffnung, dass es einen Kommentar gibt, der dies erklärt. Der Code, der für das Hinzufügen verantwortlich ist, ist hier .
javascript
ecmascript-6
babeljs
Will Smith
quelle
quelle
_b.a.call()
, um die Absicht klar zu machen.Antworten:
(0, _b.a)()
stellt sicher, dass die Funktion_b.a
mitthis
set auf das globale Objekt aufgerufen wird (oder wenn der strikte Modus aktiviert ist, aufundefined
). Wenn Sie_b.a()
direkt anrufen ,_b.a
wird mitthis
set to aufgerufen_b
.(0, _b.a)();
ist äquivalent zu(
,
Dies ist der Kommaoperator, siehe https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator ).quelle
var _a = (0, _b.a)
am Anfang der Datei und das anschließende Aufrufen_a
in vielen Fällen mehr Speicherplatz sparen würden. Irgendeine Idee, dass sie das nicht getan haben?_b.a
ein (dynamischer) Getter ist.this === undefined
und Sie müssen nicht einmal das globale Objekt erwähnenSchauen wir uns also ein Beispiel an:
Jetzt ist in
foo
Methodethis
gleicha
(weil anfoo
angehängt ista
). Wenn Sie alsoa.foo(
direkt anrufen , wird diefalse
Konsole angemeldet.Aber wenn Sie angerufen würden
(0, a.foo)()
. Der Ausdruck(0, a.foo)
wertet jeden seiner Operanden aus (von links nach rechts) und gibt den Wert des letzten Operanden zurück. Mit anderen Worten,(0, a.foo)
ist äquivalent zuDa diese Funktion nicht mehr an irgendetwas gebunden ist,
this
ist sie das globale Objektwindow
. Deshalb meldet es sichtrue
beim Anruf in der Konsole an(0, a.foo)()
.quelle
console.log(this === window);
in der Dev-Konsole protokolliert den Druck nicht mehr.