首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法用Esprima/Acorn解析函数:意外令牌'(‘

无法用Esprima/Acorn解析函数:意外令牌'(‘
EN

Stack Overflow用户
提问于 2018-03-29 19:50:18
回答 1查看 1.8K关注 0票数 1

我能够使用Esprima和Acorn解析箭头函数,但是使用正常函数会产生一个错误:

代码语言:javascript
复制
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

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-29 19:54:35

tl;dr

如果行以令牌function开头,则它是https://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions,而不是https://www.ecma-international.org/ecma-262/6.0/#sec-functions-and-classes。和函数声明需要一个标识符 (在FunctionExpression 它是可选的中)。

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

在Chrome控制台中尝试一下,您将得到相同的错误。

要理解,您必须了解语法os ES6 (下面将有更多内容)。

() => {} (https://www.ecma-international.org/ecma-262/6.0/#sec-arrow-function-definitions)是始终是一个表达式(确切地说,信不信由你,一个https://www.ecma-international.org/ecma-262/6.0/#sec-assignment-operators)。

A JavaScript,在ES6中,https://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-scripts-and-modules大致是一个语句序列(https://www.ecma-international.org/ecma-262/6.0/#sec-block,它是https://www.ecma-international.org/ecma-262/6.0/#sec-block的序列)。

https://www.ecma-international.org/ecma-262/6.0/#sec-blockhttps://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-statements-and-declarationshttps://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-statements-and-declarations

https://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-statements-and-declarationshttps://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-statements-and-declarations之间,唯一可能的表达式是https://www.ecma-international.org/ecma-262/6.0/#sec-expression-statement

https://www.ecma-international.org/ecma-262/6.0/#sec-expression-statement不过是一个https://www.ecma-international.org/ecma-262/6.0/#sec-expression-rules

https://www.ecma-international.org/ecma-262/6.0/#sec-expression-rules中,您可以找到https://www.ecma-international.org/ecma-262/6.0/#sec-functions-and-classes

因为它们以相同的标记开头,所以我相信https://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions优先于https://www.ecma-international.org/ecma-262/6.0/#sec-functions-and-classes (前者在语法上“不那么深入”)。因此,解析器将使用令牌function,并期望https://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions继续,从而引发错误。

消除错误

您可以添加一个标识符,以满足https://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions的要求:

代码语言:javascript
复制
console.log(esprima.parseScript(`function test() { console.log('Test')}`));
console.log(acorn.parse(`function test() { console.log('Test') }`);

但是,再一次,这使它成为一个FunctionDeclaration。要使代码单独成为一个函数表达式,正如@JaredSmith评论中指出的那样,将其包装到(/)中:

代码语言:javascript
复制
console.log(esprima.parseScript(`(function () { console.log('Test')} )`));
console.log(acorn.parse(`(function () { console.log('Test') } )`);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49564001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档