我能够使用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有什么建议吗?
发布于 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-block是https://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-declarations。
在https://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-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的要求:
console.log(esprima.parseScript(`function test() { console.log('Test')}`));
console.log(acorn.parse(`function test() { console.log('Test') }`);但是,再一次,这使它成为一个FunctionDeclaration。要使代码单独成为一个函数表达式,正如@JaredSmith在评论中指出的那样,将其包装到(/)中:
console.log(esprima.parseScript(`(function () { console.log('Test')} )`));
console.log(acorn.parse(`(function () { console.log('Test') } )`);https://stackoverflow.com/questions/49564001
复制相似问题