Вавилон задыхается от кода, который использует шаблон модуля со стрелкой.
Если я попытаюсь обработать файл, который читает:
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 обрабатывает файл без проблем.
Что я делаю неправильно? Есть ли подлинная проблема синтаксиса с кодом функции стрелки, о котором я не знаю?
Попробуйте переместить свой парик внутрь, например:
})();
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
})();
(() => { }())
не является допустимым синтаксисом , Это не проблема Вавилона.
Из-за характера функций стрелок и их интерпретации (например:
const x = () => ({ objectPropValues });
const x = () => { functionBody };
const x = () => conciseFunctionBody;
Я полагаю, что вторая стрелка действует в
const x = (() => {functionBody})();
const x = (() => {functionBody}());
Нельзя допускать, и нет.
Вероятно, это можно подтвердить, внимательно изучив спецификацию ECMA 6 для функций стрелок.
})();
вместо}());
Вы генерируете определение функции, а не выражение в противном случае.( () => {...}() )
вы делаете( () => {...})()
, что является другой стандартной формой для немедленно вызываемых выражений функций.