gpt4 book ai didi

node.js - new Function 和 vm 有什么区别?

转载 作者:搜寻专家 更新时间:2023-11-01 00:39:36 32 4
gpt4 key购买 nike

我想知道 new Function 之间有什么区别? (实际上 – eval )和 vm模块。

从表面上看,这些看起来很相似:

  • 两者都可以限制在特定上下文中(在 vm 中使用 context 并在 Function 构造函数中使用 parameters)。
  • vm 可以使用 runInContext 在多次调用之间重用上下文. new Function 可以使用参数重复使用相同的上下文。

但是,一个简单的基准测试显示了 vmnew Function 之间相当显着的性能差异。因此,我假设它们各自的运作方式存在根本差异。

我想了解其中的区别,以便在使用哪种工具时做出明智的决定。


我知道有一个类似的问题 ( Node.JS vm.runInNewContext() vs require() and eval() )。然而,这个问题已经进入讨论 evalrequire 之间的区别。它没有解决 evalvm 模块之间的区别。

最佳答案

下面是一些代码来显示一些差异:

const vm = require('vm');

globalName = 'global';
var localName = 'local';

function code(prefix) {
return `console.log("${prefix}:", typeof globalName, typeof localName)`;
}

eval(code('eval'));

new Function(code('function'))();

vm.runInThisContext(code('vm, this ctx'));
vm.runInNewContext(code('vm, new ctx'));

它的输出:

eval: string string
function: string undefined
vm, this ctx: string undefined
evalmachine.<anonymous>:1
console.log("vm, new ctx:", typeof globalName, typeof localName)
^

ReferenceError: console is not defined

所以:

  • eval 可以访问全局变量和局部变量
  • new Function 可以访问全局变量,但不能访问局部变量
  • vm.runInThisContext() 可以像 new Function 一样访问
  • vm.runInNewContext() 甚至无法访问全局变量,如 console

vm 函数有一些额外的功能,比如能够传递超时来限制代码的运行时间。

从安全的角度来看,vm.runInNewContext() 是最受限制的。如果 require 函数未通过沙箱对象显式传入,它甚至不允许 require()

关于node.js - new Function 和 vm 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39416716/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com