首页 > 解决方案 > 如何在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可以很好地控制它。

非常感谢您的帮助!

标签: javascriptnode.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通话中。

很可能有更好的方法来完成你正在寻找的东西,但我想我会分享这种可能性,以防它适合你的需要。


推荐阅读