Шаблон модуля Babelifying JavaScript с помощью функций стрелки ES6

1

Вавилон задыхается от кода, который использует шаблон модуля со стрелкой.

Если я попытаюсь обработать файл, который читает:

const lib = (() => {
  function sum(a, b)  { return a + b; }
  function mult(a, b) { return a * b; }

  return {
    sum,
    mult
  };
}());

Babel дает SyntaxError

{ SyntaxError: /home/david/Sync/ebs/office/fake.js: Unexpected token, expected "," (9:1)

   7 |     mult
   8 |   };
>  9 | }());
     |  ^
  10 | 
    at Parser.raise (/home/david/Sync/ebs/office/node_modules/@babel/parser/lib/index.js:3939:15)
    at Parser.unexpected (/home/david/Sync/ebs/office/node_modules/@babel/parser/lib/index.js:5248:16)
    at Parser.expect (/home/david/Sync/ebs/office/node_modules/@babel/parser/lib/index.js:5236:28)
    at Parser.parseParenAndDistinguishExpression (/home/david/Sync/ebs/office/node_modules/@babel/parser/lib/index.js:6454:14)
    at Parser.parseExprAtom (/home/david/Sync/ebs/office/node_modules/@babel/parser/lib/index.js:6284:21)
    at Parser.parseExprSubscripts (/home/david/Sync/ebs/office/node_modules/@babel/parser/lib/index.js:5924:21)
    at Parser.parseMaybeUnary (/home/david/Sync/ebs/office/node_modules/@babel/parser/lib/index.js:5903:21)
    at Parser.parseExprOps (/home/david/Sync/ebs/office/node_modules/@babel/parser/lib/index.js:5812:21)
    at Parser.parseMaybeConditional (/home/david/Sync/ebs/office/node_modules/@babel/parser/lib/index.js:5784:21)
    at Parser.parseMaybeAssign (/home/david/Sync/ebs/office/node_modules/@babel/parser/lib/index.js:5731:21)
  pos: 137,
  loc: Position { line: 9, column: 1 },
  code: 'BABEL_PARSE_ERROR' }

Однако, если я изменю код, чтобы использовать более старую функцию стиля, например

const lib = (function () {
  function sum(a, b)  { return a + b; }
  function mult(a, b) { return a * b; }

  return {
    sum,
    mult
  };
}());

Кажется, что Babel обрабатывает файл без проблем.

Что я делаю неправильно? Есть ли подлинная проблема синтаксиса с кодом функции стрелки, о котором я не знаю?

  • 0
    попробуйте -> })(); вместо }()); Вы генерируете определение функции, а не выражение в противном случае.
  • 2
    Я только что попытался скопировать в консоль браузера (Chrome), похоже, это подлинная синтаксическая ошибка. Это работает, хотя, если вместо ( () => {...}() ) вы делаете ( () => {...})() , что является другой стандартной формой для немедленно вызываемых выражений функций.
Показать ещё 1 комментарий
Теги:
ecmascript-6
babeljs
revealing-module-pattern
module-pattern

2 ответа

1
Лучший ответ

Попробуйте переместить свой парик внутрь, например:

})();

const lib = (() => {
  function sum(a, b)  { return a + b; }
  function mult(a, b) { return a * b; }

  return {
    sum,
    mult
  };
})();
console.log(lib)

В ES6 функция стрелки в основном состоит из следующих трех компонентов:

() => {}

Поэтому, чтобы немедленно вызвать его, он должен быть заключен в круглые скобки и затем вызван так:

const lib = (() => {
    //do something
})();
  • 0
    Почему он должен отличаться от старого синтаксиса функции?
  • 0
    @ DavidY.Stephenson Вам нужно разобраться в спецификации ES 6, чтобы понять это (если кто-то не захочет сделать это за вас), но в основном кажется, что (() => { }()) не является допустимым синтаксисом , Это не проблема Вавилона.
Показать ещё 1 комментарий
2

Из-за характера функций стрелок и их интерпретации (например:

const x = () => ({ objectPropValues });
const x = () => { functionBody };
const x = () => conciseFunctionBody;

Я полагаю, что вторая стрелка действует в

const x = (() => {functionBody})();
const x = (() => {functionBody}());

Нельзя допускать, и нет.

Вероятно, это можно подтвердить, внимательно изучив спецификацию ECMA 6 для функций стрелок.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню