繁体   English   中英

当被调用函数本身在上下文中时,如何避免nodejs vm脚本函数调用丢失上下文?

[英]How do I avoid nodejs vm script function call losing context when called function is itself in the context?

问题:我正在使用nodejs vm运行提供的脚本(可信源,但不在我的控件中)。 提供的脚本必须在收到的上下文中回调我提供的功能。

脚本内部的功能按预期工作。 但是,当调用上下文中提供的函数时,该函数不再具有提供给被调用脚本的上下文中的任何变量。 这个简短的程序演示了该问题:

var vm = require('vm');
var sandbox={console:console, myfn:function() {
        console.log("MYFN");
        console.log("MYFN: a="+a);
}, a:42};
var ctx = new vm.createContext(sandbox);
vm.runInContext("function okfn() { console.log('OKFN'); console.log('OKFN: a='+a); } console.log('TEST'); console.log('TEST: a='+a);okfn(); myfn();", ctx, {filename:"TEST"});

当它运行时,我希望看到以下输出:

TEST
TEST: a=42
OKFN
OKFN: a=42
MYFN
MYFN: a=42

但是,相反,myfn()中的最后一个console.log会产生ReferenceError:未定义

当脚本调用上下文本身提供的函数时,是否有办法保留通过runInContext()传递给脚本的上下文?

函数绑定到定义它们的全局范围。 由于myfn是在主脚本文件中定义的,因此它将使用该文件的全局变量。 为了将该功能绑定到另一个全局上下文,必须在该上下文中重新定义/重新执行它:

var vm = require('vm');

function myfn() {
    console.log("MYFN");
    console.log("MYFN: a="+ a);
}


var sandbox={console:console, a:42};
var ctx = new vm.createContext(sandbox);

// Evaluates the source code of myfn in the new context
// This will ensure that myfn uses the global context of 'ctx'
vm.runInContext(myfn.toString(), ctx, {filename: "TEST"});

// Retained in the context
console.log(ctx.myfn);

// Use it
vm.runInContext("function okfn() { console.log('OKFN'); console.log('OKFN: a='+a); } console.log('TEST'); console.log('TEST: a='+a);okfn();  myfn();", ctx, {filename:"TEST"});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM