如何检查函数是否是纯函数?

问题描述 投票:0回答:3

我正在开发 react-metaform,我的挑战之一是我需要允许最终用户将元数据定义为函数。示例:

socialSecurityNumber.required: (m) => m.type == 'person'

问题很明显:我不能信任用户。所以,这些是我计划采取的预防措施:

  • 用户定义的函数应该是纯函数。从某种意义上说,这些函数只能访问它们的参数,而不能访问其他内容。
  • 用户定义的函数将在对异常、执行时间过长和无限循环具有弹性的环境中运行。 (我现在不担心这个)。

问题是:如何确保用户定义的函数仅访问其参数而不访问其他内容?

javascript node.js
3个回答
2
投票

我会使用 esprima 来解析用户存储在文件或数据库中的 JavaScript 函数。我只允许运行通过解析测试的代码(仅白名单功能 - 使用局部变量、参数……)。

您可以从一个非常简单的检查代码开始,该代码只允许非常有限的脚本,然后逐步改进它。但是,我想随着时间的推移,您会在解决方案上投入大量精力,因为您的用户总是想要更多。


注意: Angular.js 使用这种“技巧”进行依赖注入:https://jsfiddle.net/987Lwezy/

function test() {
   console.log("This is my secret!");
}


function parser(f) {
    document.body.innerHTML = test.toString();
}

parser(test);

0
投票

您可以使用https://github.com/lcrespom/purecheck。有一段时间没有更新了,但似乎支持你所需要的。


0
投票

对于仍在寻找解决方案的人,我公开了我的 is-function-pure 存储库 检测 JavaScript 函数是否是纯函数。您可以尝试一下,如有任何反馈,我们将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.