drip-table
Version:
A tiny and powerful enterprise-class solution for building tables.
62 lines (50 loc) • 1.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createEvaluator = void 0;
/**
* This file is part of the drip-table project.
* @link : https://drip-table.jd.com/
* @author : Emil Zhai (root@derzh.com)
* @modifier : Emil Zhai (root@derzh.com)
* @copyright: Copyright (c) 2021 JD Network Technology Co., Ltd.
*/
/**
* 执行器缓存,优化性能
*/
var evaluatorCache = new Map();
var timerEvaluatorGC = 0;
var evaluatorGC = function evaluatorGC() {
evaluatorCache.clear();
};
var resetEvaluatorGC = function resetEvaluatorGC() {
if (timerEvaluatorGC) {
window.clearTimeout(timerEvaluatorGC);
}
timerEvaluatorGC = window.setTimeout(evaluatorGC, 2000);
};
/**
* 通过 JavaScript 代码字符串创建函数
*
* @param script JavaScript 代码段
* @param contextKeys 执行上下文变量名
* @returns 创建的函数
* @throws Error 创建异常
*/
var createEvaluator = function createEvaluator(script) {
var contextKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var key = script + JSON.stringify(contextKeys);
var evaluator = evaluatorCache.has(key) ? evaluatorCache.get(key) : void 0;
if (!evaluator) {
// 包裹二阶函数,用于兼容微前端
script = "return function(".concat(contextKeys.join(', '), ") { ").concat(script, "\n}");
evaluator = new Function('window', script)(window);
if (evaluator) {
evaluatorCache.set(key, evaluator);
}
}
resetEvaluatorGC();
return evaluator;
};
exports.createEvaluator = createEvaluator;