首页 > 解决方案 > 内部带有函数的字符串化函数

问题描述

有没有办法对内部有函数的函数进行字符串化?我想对函数进行字符串化bar

const foo = (x) => {
  return x + x;
};
const bar = (y) => {
  return foo(y)
};

bar.toString()返回

function bar(y) {
  return foo(y);
} 

但我想要类似的东西:

const bar = (y) => {
  const foo = (x) => {
    return x + x;
  };
  return foo(y);
};

甚至可能吗?我想使用bar如下:

// I don't have control below this line
import bar from 'bar';

`<script>(${bar})(5)</script>`

标签: javascript

解决方案


甚至可能吗?

大概。这一点都不简单。为此,您必须使用像 Esprima 或 Babel、ESLint 等中的 JavaScript 解析器来解析包含两者的源代码,barfoo使用生成的 AST 来识别bar调用的函数,将这些函数转换为源代码,转换bar为源代码,并将它调用的函数插入到它的开头。即便如此,根据这些函数调用什么以及它们使用什么东西来关闭它们,您可能还有更多工作要做。

很容易想到“好吧,我可以toString在函数上使用,然后使用一些正则表达式来找出函数bar调用的内容。” 但是 JavaScript 源代码语法过于复杂,无法用一两个正则表达式正确识别函数代码中的函数调用。你需要一个合适的解析器。

正如有人在评论中所说(现已删除),这听起来像是一个 X/Y 问题 ——就像你试图通过对bar. 我会专注于以不同的方式解决这个问题。


推荐阅读