我如何避免nodejs虚拟机脚本函数调用失去上下文时,调用的函数本身是在上下文中
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: a is not defined
是否有一种方法来保留通过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"});
相关文章:
- 将函数的上下文应用于javascript变量
- 是否可以在不更改上下文的情况下调用函数.apply
- 调用$.each()函数时上下文发生变化
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 访问函数对象的上下文属性|如何
- 构造函数函数中的自执行函数的OO上下文/范围
- 覆盖上下文.属性和函数
- 对象方法中函数中的上下文
- node.js中的箭头函数上下文
- extjs中事件处理程序函数中的THIS上下文
- 使用数组-apply()中的参数调用函数,但不使用上下文参数
- 函数调用上下文
- 如何使用子窗口上下文执行在父窗口中定义的函数
- 为什么Chrome无法(或can)在ES6的Arrow函数中找到上下文
- 如何创建一个原型函数,将另一个原型函数绑定为语法糖(并保持实例的上下文)
- 在 mongo map 中调用外部 javascript 函数(对象)或减少上下文的可能方法
- 函数参数的 JavaScript 执行上下文
- 是否可以绑定javascript函数,使其本地上下文与“this”相同
- 上下文菜单项上下文函数未执行
- D3js:鼠标悬停对象上下文(函数指针)