Почему babel переписывает импортированный вызов функции на (0, fn)(...)?



учитывая входной файл, как



import { a } from 'b';

function x () {
a()
}


babel скомпилирует его в



'use strict';

var _b = require('b');

function x() {
(0, _b.a)();
}


но при компиляции в свободном режиме вызове функции выводится как _b.a();



Я сделал некоторые исследования в том, где оператор запятой добавляется в надежде, что был комментарий, объясняющий это.
Код, ответственный за его добавление -здесь.

538   2  

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. Вот почему это log true в консоли, когда вызов (0, a.foo)().

Comments

    Ничего не найдено.