首页 > 解决方案 > 确定字符串中的最外层范围是否是 JavaScript 语言中的函数

问题描述

我说语言不可知论的原因是我想要一个小的、自包含的实现来确定包含 JavaScript 的字符串中的最外层范围是否是函数。我查看了MDN以获取有关声明函数的可能形式的指导,但不幸的是,无法找到任何可以在 JS 中定义函数的所有方式的全面示例。

以下是实现应该能够处理的几个不同的测试用例:

// yes
function (){}

//yes
() => p

//yes
((g) => p)

//yes
(g => p)

//no
(()=>p)()).call()

//no
a = function (){
  console.log()
{

//no
g=() => p

我考虑过尝试构建一个正则表达式来查找这个,但我不确定我是否涵盖了所有情况,并且我还没有找到任何类型的示例 JS 函数语料库,或者即使是纯正则表达式方法将是处理此问题的最佳方法。

标签: javascriptregex

解决方案


您可以使用Acorn来解析 Javascript。如果解析成功,并且正文仅由单个项目组成,并且该项目是 a FunctionDeclarationor ArrowFunctionExpression,则测试通过:

const test = (str) => {
  console.log(str);
  try {
    const { body } = acorn.parse(str);
    if (body.length > 1) throw new Error();
    const [item] = body;
    if (item.type === 'FunctionDeclaration' || (item.type === 'ExpressionStatement' && item.expression.type === 'ArrowFunctionExpression')) {
      console.log('Pass');
    } else {
      console.log('invalid');
    }
  } catch(e) {
    console.log('invalid');
  }
};

// function (){}

test(`function foo() {}`);
test(`() => p`);
test(`((g) => p)`);
test(`(g => p)`);
test(`(()=>p)()).call()`);
test(`a = function (){
  console.log()
{`);
test(`g=() => p`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/acorn/7.1.1/acorn.min.js"></script>


推荐阅读