javascript - 确定字符串中的最外层范围是否是 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 函数语料库,或者即使是纯正则表达式方法将是处理此问题的最佳方法。
解决方案
您可以使用Acorn来解析 Javascript。如果解析成功,并且正文仅由单个项目组成,并且该项目是 a FunctionDeclaration
or 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>
推荐阅读
- filesystems - 从 emmc 上的 CRAMFS 分区启动
- docker-compose - WSL2 + docker-compose:无法打开自我 $path/docker-compose 或存档 $path/docker-compose.pkg
- javascript - 如何在 mongo find javascript 中使用小于比较?
- android - Android Jetpack Compose:无法为 OutlinedTextField 设置 backgroundColor
- javascript - 如何使用 create-react-app 从外部模块导入 svg react 组件?
- ios - Swift 用户模型 Flash 错误
- android - 修改aosp框架代码构建的sdk如何使用?
- json - 我可以从 VSC 中的 tasks.json 访问其他 json 文件中定义的设置吗?
- python - 从 YouTube、SoundCloud 和其他平台获取元数据和 MRL
- java - 方法标记为 @Async 在 Map 对象操作处停止执行 Spring boot