Dado un archivo de entrada como
import { a } from 'b';
function x () {
a()
}
babel lo compilará para
'use strict';
var _b = require('b');
function x() {
(0, _b.a)();
}
pero cuando se compila en modo suelto, la llamada a la función se emite como _b.a();
He investigado un poco dónde se agrega el operador de coma con la esperanza de que haya un comentario que lo explique. El código responsable de agregarlo está aquí .
javascript
ecmascript-6
babeljs
Will Smith
fuente
fuente
_b.a.call()
para dejar clara la intención.Respuestas:
(0, _b.a)()
asegura que la función_b.a
se llame conthis
el objeto global establecido (o si el modo estricto está habilitado, enundefined
). Si tuviera que llamar_b.a()
directamente, entonces_b.a
se llama conthis
configurado en_b
.(0, _b.a)();
es equivalente a(
,
es el operador de coma, consulte https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator ).fuente
var _a = (0, _b.a)
en la parte superior del archivo y luego llamar_a
ahorraría más espacio en muchos casos, ¿alguna idea de que no hicieron eso?_b.a
es un captador (dinámico).this === undefined
y ni siquiera necesita mencionar el objeto globalEntonces, veamos un ejemplo:
Ahora, en
foo
método,this
es igual aa
(porquefoo
se adjunta aa
). Entonces, si llamaa.foo(
) directamente, iniciará sesiónfalse
en la consola.Pero, si te llamaras
(0, a.foo)()
. La expresión(0, a.foo)
evaluará cada uno de sus operandos (de izquierda a derecha) y devolverá el valor del último operando. En otras palabras,(0, a.foo)
es equivalente aDado que esta función ya no está asociada a nada,
this
es el objeto globalwindow
. Es por eso que inicia sesióntrue
en la consola cuando llama(0, a.foo)()
.fuente
console.log(this === window);
en la consola de desarrollo ya no registra la impresión.