从包含的eval脚本访问nodejs main的局部变量上下文

时间:2015-12-15 20:38:30

标签: node.js include eval

我找到了以下方法来包含nodejs文件,而不是将它们转换为模块。只有一个小警告。我不希望在main.js中将我的var更改为global,因此included.js文件可以访问它。正如您在包含的文件中看到的那样,我不必这样做。那里的变量可以访问我的主要内容。见代码。有些情况下,可以在包含的文件中访问节点主文件的本地上下文,而不必诉诸于将所有var。*更改为global。*如果我希望它们通过include进行访问。

这是代码

//主文件

//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();

//包含文件

// evalinc.js is the file to be included
// Note, it's not a module. Just plain JS
debugger;
globalVar=100; // Sets the global variable at main!
var evalVar="Set in evalinc!";
var showvars=function(){
    console.log("globalVar: ",++globalVar, "  evalVar: ", evalVar);
}

2 个答案:

答案 0 :(得分:1)

不,本地变量上下文不能以编程方式访问。但是,您可以创建一个专用对象,该对象将成为脚本的上下文:

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();

答案 1 :(得分:1)

你试过一个简单的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();