gpt4 book ai didi

javascript - 无法使用 Esprima/Acorn : unexpected token '(' 解析函数

转载 作者:行者123 更新时间:2023-11-30 09:24:58 25 4
gpt4 key购买 nike

我能够使用 Esprima 和 Acorn 解析箭头函数,但使用普通函数会出现错误:

const esprima = require('esprima');
const acorn = require('acorn');

console.log(esprima.parseScript(` () => { console.log('Test')}`)); //works
console.log(acorn.parse(` () => { console.log('Test') }`); //works

console.log(esprima.parseScript(`function () { console.log('Test')}`)); // Unexpected token
console.log(acorn.parse(`function () { console.log('Test') }`); //Unexpected token

有什么建议吗?

最佳答案

tl;dr

如果该行以标记 function 开头,则它是一个 FunctionDeclaration , 不是 FunctionExpression .和函数声明 requires an identifier (在 FunctionExpression it is optional 中)。

--------

function () { console.log('Test') } 代码的编写方式,使其成为 function declaration (FunctionDeclaration) ,不是函数表达式。函数声明需要一个标识符(在函数表达式中 it is optional )。

在 Chrome 控制台中尝试,你会得到同样的错误。

要了解,您必须查看 the grammar os ES6 (更多内容见下文)。

() => {} ( ArrowFunction ) 总是一个表达式(不管你信不信,具体来说,一个 AssignmentExpression )。


ES6 中的 JavaScript,Script大致是一系列语句( StatementList ,它是一系列 StatementListItem s)。

A StatementListItemStatementDeclaration .

Statement 之间或 Declaration ,唯一可能的表达式是 ExpressionStatement .

ExpressionStatement只不过是一个 Expression .

并且在 Expression你找到FunctionExpression .

因为它们以相同的标记开头,所以我相信 FunctionDeclaration优先于 FunctionExpression (前者在语法上“不那么深入”)。因此解析器使用 token function 并期望 FunctionDeclaration继续,抛出错误。


消除错误

您可以添加一个标识符,实现 FunctionDeclaration的要求:

console.log(esprima.parseScript(`function test() { console.log('Test')}`));
console.log(acorn.parse(`function test() { console.log('Test') }`);

但是,这又使它成为一个 FunctionDeclaration。使您的代码单独成为函数表达式,如 @JaredSmith 所指出的那样在 comments , 将其包装成 (/)s:

console.log(esprima.parseScript(`(function () { console.log('Test')} )`));
console.log(acorn.parse(`(function () { console.log('Test') } )`);

关于javascript - 无法使用 Esprima/Acorn : unexpected token '(' 解析函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49564001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com