javascript - 如何在nodejs中精细管理一个孤立的范围?
问题描述
我试图在 javascript 中有一个范围,我可以在其中运行代码并且对我的本地范围不可见。
main.js
const isolated = require('./isolated.js');
function f() {return "a";} // invisible by the isolated scope
isolated.eval('function f() {return "b";}'); // invisible by my local scope
let b = isolated.eval("f();"); // I could get the result however
console.log(b); // "b"
带有模块的解决方案将是完美的。但它甚至可能吗?
孤立的.js
module.exports = {
eval: ???
}
到目前为止,我最好的选择是生成一个临时文件,使用process.fork()执行它并从日志文件中获取结果。但我正在寻找一种轻量级的东西,我main.js
可以很好地控制它。
非常感谢您的帮助!
解决方案
我有一个解决这个问题的有点老套的方法,但它可能适用于你的目的。您可以拥有一个声明变量/函数,另一个调用您之前声明的变量/函数的 eval 函数,而不是单独使用一个 eval 函数。您可以在本地字典中跟踪您在调用函数中附加到 eval 的声明。像这样的东西:
孤立的.js
var isolatedFunctions = {};
module.exports.declare = function(strName, strContents) {
isolatedFunctions[strName] = eval(`(${strContents})`);
}
module.exports.call = function (strCall) {
return eval(`(isolatedFunctions.${strCall})`);
}
然后你会像这样使用它:
main.js
const isolated = require("./isolated.js");
function f() { return "a" }
isolated.declare ("f", "function() { return 'b' }");
var b = isolated.call("f()");
var a = f();
console.log(a); // Outputs "a"
console.log(b); // Outputs "b"
对此有一些明显的限制,主要是您必须非常具体地调用函数的方式,因为为了适应参数的可能性,它只是在“isolatedFunctions”前面加上。在eval
通话中。
很可能有更好的方法来完成你正在寻找的东西,但我想我会分享这种可能性,以防它适合你的需要。
推荐阅读
- php - 根据选定的 div 进行下拉选择(使用 jQuery)
- php - 是否有一个功能可以让您知道您来自网站的哪个页面?
- markdown - 使用 jekyll 的“包含”和备注
- python - 使用 QProcess 运行 python 脚本并显示到文本中实时编辑结果
- python - Dash Plotly 中的向下钻取图表操作。触发下钻时如何更新下拉菜单(图表对象已更改)
- r - 在 R 中按日期序列和 id 变量聚合
- php - 使用 PHP 流式传输视频并使用 FFMPEG 进行操作
- javascript - 如何使用对象的 ObjectId 从对象数组中检索对象?- ReactJs、NodeJs、MongoDB
- python - 在 Django 中使用视图/表单上传多个文件
- swiftui - iOS 15 上的 SwiftUI,使用 contextMenu 时出现 [UICollectionViewRecursion] 的奇怪警告