javascript - 从评估代码访问导入的函数
问题描述
我有一个带有以下代码的 TypeScript 文件:
import { functionTest } from './function_test'
function runnerFunctionTest() {
console.log("Test");
}
export class Runner {
run(source : string) {
eval(source);
}
}
如果我实例化 aRunner
并调用run("runnerFunctionTest();")
该函数正确运行,但如果我调用run("functionTest();")
(它应该运行导入的函数)我得到一个错误,说functionTest
未定义。
我怎样才能解决这个问题?
我尝试过的一件事是替换其中有效的代码,run
但new Function('functionTest', source).(functionTest);
必须添加所有这样的导入函数真的很烦人 - 其中大约有 20 个,而且这个数字只会随着时间的推移而增加。
另外,我知道调用的安全隐患eval
——这是做我想做的事情的唯一方法(至少我知道),即在用户的浏览器中运行用户生成的任意 JavaScript 代码。
解决方案
因为import
不是原生操作符,所以 webpack(或其他东西)为你转换它。通过 webpack 编译后,您的代码变为:
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Runner", function() { return Runner; });
/* harmony import */ var _function_test__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
function runnerFunctionTest() {
console.log("Test");
}
class Runner {
run(source) {
eval(source);
}
}
该名称functionTest
不再存在,这就是您无法评估它的原因。
一种可能的解决方案是给它一个本地名称:
import { functionTest } from './function_test'
const function_test = functionTest;
function runnerFunctionTest() {
console.log("Test");
}
export class Runner {
run(source : string) {
eval(source);
}
}
然后你可以运行runner.run('function_test()')
推荐阅读
- database - 如何将 mongo 与 elasticsearch 同步
- javascript - 在 summernote 工具栏中添加一些文本
- elasticsearch - 动态更改弹性搜索查询中的“来自”值
- postgresql - 游标中的循环无法正常工作
- postgresql - 已安装postgis但无法创建扩展:错误:无法打开扩展控制文件~/postgis.control":没有这样的文件或目录
- javascript - JQuery函数在另一个函数之后不起作用
- artificial-intelligence - 对话框流中 fb messenger 的“开始”按钮
- c# - 实体框架中的用户定义表生成不正确的查询
- c# - 将文件分组为 500MB 块
- laravel - 在 laravel 5.7 中将 pdf 文件作为电子邮件附件发送