Почему babel переписывает импортированный вызов функции на (0, fn)(...)?
учитывая входной файл, как
import { a } from 'b';
function x () {
a()
}
babel скомпилирует его в
'use strict';
var _b = require('b');
function x() {
(0, _b.a)();
}
но при компиляции в свободном режиме вызове функции выводится как _b.a();
Я сделал некоторые исследования в том, где оператор запятой добавляется в надежде, что был комментарий, объясняющий это.
Код, ответственный за его добавление -здесь.
2 ответов:
(0, _b.a)()гарантирует, что функция_b.aСthisустановить в глобальный объект (или если включен строгий режим, вundefined). Если бы вы позвонили_b.a(), а потом_b.aСthisзначение_b.
(0, _b.a)();эквивалентно0; // Ignore result var tmp = _b.a; tmp();(the
,оператор запятой, см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator).
оператор "запятая" вычисляет каждый из своих операндов (слева направо) и возвращает значение последнего операнда.
console.log((1, 2)); // Returns 2 in console console.log((a = b = 3, c = 4)); // Returns 4 in consoleИтак, давайте рассмотрим пример:
var a = { foo: function() { console.log(this === window); } }; a.foo(); // Returns 'false' in console (0, a.foo)(); // Returns 'true' in consoleтеперь,
fooметодthisравнаa(посколькуfooприсоединена кa). Так что если вы позвонитеa.foo() непосредственно, он будет регистрироватьfalseв консоли.но, если бы Вы были позвонить
(0, a.foo)(). Выражение(0, a.foo)будет оценивать каждый из его операндов (слева направо) и возвращает значение второго операнда. Другими словами,(0, a.foo)эквивалентноfunction() { console.log(this === window); }поскольку эта функция больше ни к чему не привязана, ее
thisглобальный объектwindow. Вот почему это logtrueв консоли, когда вызов(0, a.foo)().
Comments