Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从包含的eval脚本访问nodejs main的局部变量上下文_Node.js_Include_Eval - Fatal编程技术网

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

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(

我发现下面的方法可以很方便地包含nodejs文件,而无需将它们转换为模块。只有一个小小的警告。我希望不必在main.js中将我的var更改为global,这样就可以通过include.js文件访问它。正如您在包含的文件中看到的,我不必这样做。那里的变量可以通过我的main访问。参见代码。是否有某种方式可以在包含的文件中访问节点主文件的本地上下文,而不必求助于将所有var.*更改为global.*来访问包含的文件

这是密码

//主文件

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