Biorąc pod uwagę plik wejściowy, taki jak
import { a } from 'b';
function x () {
a()
}
babel skompiluje go do
'use strict';
var _b = require('b');
function x() {
(0, _b.a)();
}
ale po kompilacji w trybie luźnym wywołanie funkcji jest wyświetlane jako _b.a();
Zrobiłem kilka badań, gdzie dodano operator przecinka, mając nadzieję, że był komentarz wyjaśniający to. Kod odpowiedzialny za jego dodanie znajduje się tutaj .
javascript
ecmascript-6
babeljs
Will Smith
źródło
źródło
_b.a.call()
aby jasno określić zamiar.Odpowiedzi:
(0, _b.a)()
zapewnia, że funkcja_b.a
jest wywoływana zthis
ustawieniem na obiekt globalny (lub, jeśli włączony jest tryb ścisły, naundefined
). Jeśli miałbyś zadzwonić_b.a()
bezpośrednio,_b.a
wywoływany jest zthis
ustawionym na_b
.(0, _b.a)();
jest równa(the
,
jest operatorem przecinka, patrz https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator ).źródło
var _a = (0, _b.a)
na początku pliku, a następnie wywołanie_a
pozwoliłoby zaoszczędzić więcej miejsca w wielu przypadkach, jakikolwiek pomysł, że tego nie zrobili?_b.a
(dynamiczny) getter.this === undefined
i nie musisz nawet wspominać o globalnym obiekcieZobaczmy więc przykład:
Teraz w
foo
metodziethis
równa sięa
(ponieważfoo
jest do niej przywiązanaa
). Więc jeśli zadzwonisza.foo(
bezpośrednio), zaloguje sięfalse
do konsoli.Ale gdybyś został wezwany
(0, a.foo)()
. Wyrażenie(0, a.foo)
oceni każdy z jego operandów (od lewej do prawej) i zwróci wartość ostatniego operandu. Innymi słowy,(0, a.foo)
jest równoważnePonieważ ta funkcja nie jest już do niczego przypisana,
this
jest obiektem globalnymwindow
. Dlatego loguje siętrue
do konsoli, gdy dzwonisz(0, a.foo)()
.źródło
console.log(this === window);
w konsoli programisty nie rejestruje już drukowania.