Определите, является ли внешняя область видимости в строке функцией на языке JavaScript, независимо от языка - PullRequest
1 голос
/ 15 марта 2020

Причина, по которой я говорю о языковой агностии c, заключается в том, что мне нужна небольшая автономная реализация, которая определяет, является ли самая внешняя область в строке, содержащей 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 функций, или даже если бы подход с чистым регулярным выражением был бы лучшим способом справиться с этим.

1 Ответ

2 голосов
/ 15 марта 2020

Вы можете использовать Желудь для анализа Javascript. Если синтаксический анализ выполнен успешно, а тело состоит только из одного элемента, и этот элемент имеет значение FunctionDeclaration или 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...