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.ase llame conthisel objeto global establecido (o si el modo estricto está habilitado, enundefined). Si tuviera que llamar_b.a()directamente, entonces_b.ase llama conthisconfigurado 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_aahorraría más espacio en muchos casos, ¿alguna idea de que no hicieron eso?_b.aes un captador (dinámico).this === undefinedy ni siquiera necesita mencionar el objeto globalEntonces, veamos un ejemplo:
Ahora, en
foométodo,thises igual aa(porquefoose adjunta aa). Entonces, si llamaa.foo() directamente, iniciará sesiónfalseen 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,
thises el objeto globalwindow. Es por eso que inicia sesióntrueen la consola cuando llama(0, a.foo)().fuente
console.log(this === window);en la consola de desarrollo ya no registra la impresión.