Учитывая входной файл, например
import { a } from 'b';
function x () {
a()
}
Babel скомпилирует это в
'use strict';
var _b = require('b');
function x() {
(0, _b.a)();
}
но при компиляции в свободном режиме вызов функции выводится как _b.a();
Я провел некоторое исследование того, где добавлен оператор запятой, в надежде, что это был комментарий, объясняющий его. Код, отвечающий за его добавление, находится здесь .
javascript
ecmascript-6
babeljs
Уилл Смит
источник
источник
_b.a.call()
это, чтобы прояснить намерение.Ответы:
(0, _b.a)()
гарантирует, что функция_b.a
вызывается сthis
установленным глобальным объектом (или, если включен строгий режим, сundefined
). Если вы вызываете_b.a()
напрямую, то_b.a
вызывается сthis
установленным значением_b
.(0, _b.a)();
эквивалентно(
,
это оператор запятой, см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator ).источник
var _a = (0, _b.a)
вверху файла с последующим вызовом_a
во многих случаях сэкономит больше места, любая идея, что они этого не сделали?_b.a
является (динамическим) получателем.this === undefined
и вам даже не нужно упоминать глобальный объектИтак, давайте посмотрим на пример:
Теперь в
foo
методеthis
равноa
(потому чтоfoo
прикреплено кa
). Поэтому, если вы позвонитеa.foo(
напрямую, он войдетfalse
в консоль.Но, если вам позвонят
(0, a.foo)()
. Выражение(0, a.foo)
будет оценивать каждый из своих операндов (слева направо) и возвращает значение последнего операнда. Другими словами,(0, a.foo)
эквивалентноПоскольку эта функция больше ни к чему не привязана,
this
это глобальный объектwindow
. Вот почему он входитtrue
в консоль при вызове(0, a.foo)()
.источник
console.log(this === window);
в консоли разработчика печать больше не ведется.