Skip to content
Advertisement

Why does babel rewrite imported function call to (0, fn)(…)?

Given an input file like

import { a } from 'b';

function x () {
  a()
}

babel will compile it to

'use strict';

var _b = require('b');

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

but when compiled in loose mode the function call is output as _b.a();

I’ve done some research into where the comma operator is added in the hope there was a comment explaining it. The code responsible for adding it is here.

Advertisement

Answer

(0, _b.a)() ensures that the function _b.a is called with this set to the global object (or if strict mode is enabled, to undefined). If you were to call _b.a() directly, then _b.a is called with this set to _b.

(0, _b.a)(); is equivalent to

0; // Ignore result
var tmp = _b.a;
tmp();

(the , is the comma operator, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator).

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement