Dado um arquivo de entrada como
import { a } from 'b';
function x () {
a()
}
babel irá compilá-lo para
'use strict';
var _b = require('b');
function x() {
(0, _b.a)();
}
mas quando compilado em modo flexível, a chamada de função é produzida como _b.a();
Eu fiz algumas pesquisas sobre onde o operador vírgula é adicionado na esperança de que houvesse um comentário explicando isso. O código responsável por adicioná-lo está aqui .
javascript
ecmascript-6
babeljs
Will Smith
fonte
fonte
_b.a.call()
para deixar a intenção clara.Respostas:
(0, _b.a)()
garante que a função_b.a
seja chamada comthis
definido para o objeto global (ou se o modo estrito estiver ativado, paraundefined
). Se você chamasse_b.a()
diretamente,_b.a
é chamado comthis
definido como_b
.(0, _b.a)();
é equivalente a(
,
é o operador vírgula, consulte https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator ).fonte
var _a = (0, _b.a)
no início do arquivo e então chamar_a
economizaria mais espaço em muitos casos, alguma ideia de que eles não fizeram isso?_b.a
é um getter (dinâmico).this === undefined
e você nem precisa mencionar o objeto globalEntão, vamos ver um exemplo:
Agora, no
foo
método,this
é igual aa
(porquefoo
está anexado aa
). Portanto, se você ligara.foo(
) diretamente, ele registraráfalse
no console.Mas, se você fosse chamado
(0, a.foo)()
. A expressão(0, a.foo)
avaliará cada um de seus operandos (da esquerda para a direita) e retornará o valor do último operando. Em outras palavras,(0, a.foo)
é equivalente aUma vez que esta função não está mais ligada a nada, é
this
é o objeto globalwindow
. É por isso que ele faz logontrue
no console quando liga(0, a.foo)()
.fonte
console.log(this === window);
no console dev não registra mais a impressão.