Node.js 从包含的eval脚本访问nodejs main的局部变量上下文
我发现下面的方法可以很方便地包含nodejs文件,而无需将它们转换为模块。只有一个小小的警告。我希望不必在main.js中将我的var更改为global,这样就可以通过include.js文件访问它。正如您在包含的文件中看到的,我不必这样做。那里的变量可以通过我的main访问。参见代码。是否有某种方式可以在包含的文件中访问节点主文件的本地上下文,而不必求助于将所有var.*更改为global.*来访问包含的文件 这是密码 //主文件Node.js 从包含的eval脚本访问nodejs main的局部变量上下文,node.js,include,eval,Node.js,Include,Eval,我发现下面的方法可以很方便地包含nodejs文件,而无需将它们转换为模块。只有一个小小的警告。我希望不必在main.js中将我的var更改为global,这样就可以通过include.js文件访问它。正如您在包含的文件中看到的,我不必这样做。那里的变量可以通过我的main访问。参见代码。是否有某种方式可以在包含的文件中访问节点主文件的本地上下文,而不必求助于将所有var.*更改为global.*来访问包含的文件 这是密码 //主文件 //evalmain.js var vm = require(
//evalmain.js
var vm = require('vm');
var fs=require("fs");
global.globalVar = 0; //<<-- *** Prefer var globalVar***
// Include the script
var script = new vm.Script(fs.readFileSync(__dirname+"\\evalinc.js"+""));
script.runInThisContext();
console.log("globalVar: ", globalVar, " evalVar: ", evalVar);
showvars();
console.log("globalVar: ",++globalVar, " evalVar: ", evalVar);
evalVar="Now set in evalmain";
showvars();
否,无法通过编程方式访问局部变量上下文。但是,您可以创建一个专用对象,该对象将成为脚本的上下文:
var vm = require('vm');
var fs=require("fs");
var globals = {
globalVar: 0
}; // not a global variable
// Include the script
var script = new vm.Script(fs.readFileSync(__dirname+"\\evalinc.js"+""));
script.runInNewContext(globals);
console.log("globalVar: ", globals.globalVar, " evalVar: ", globals.evalVar);
globals.showvars();
console.log("globalVar: ", ++globals.globalVar, " evalVar: ", globals.evalVar);
globals.evalVar="Now set in evalmain";
globals.showvars();
您是否尝试过简单的
eval
?我想这正是你在这里所期待的魔力,即使不影响全球范围
var fs=require("fs");
var globalVar = 0;
eval(fs.readFileSync(__dirname+"\\evalinc.js")); // Include the script
console.log("globalVar: ", globalVar, " evalVar: ", evalVar);
showvars();
console.log("globalVar: ", ++globalVar, " evalVar: ", evalVar);
evalVar = "Now set in evalmain";
showvars();
还有很多其他的方法给猫剥皮。我正在寻找一种既不修改代码也不修改include/eval代码的方法。我的解决方案更简单,因为我所要做的就是修改代码中的全局变量声明。ie var globalVar=0-->全局。globalVar=0。更有趣的是,您可以删除var声明并将变量初始化为globalVar=0,您将获得相同的效果。但是仍然修改代码。通过对node的所有内省,您可能会认为有一种方法可以通过编程方式访问本地上下文。
var fs=require("fs");
var globalVar = 0;
eval(fs.readFileSync(__dirname+"\\evalinc.js")); // Include the script
console.log("globalVar: ", globalVar, " evalVar: ", evalVar);
showvars();
console.log("globalVar: ", ++globalVar, " evalVar: ", evalVar);
evalVar = "Now set in evalmain";
showvars();