new Function 和 vm 有什么区别?

2024-01-03

我想知道两者之间有什么区别新功能 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function(实际上 –eval https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/eval) and vm https://nodejs.org/api/vm.html module.

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

  • 两者都可以限制在特定的上下文中(使用context https://nodejs.org/api/vm.html#vm_vm_createcontext_sandbox in vm并使用参数 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function#Parameters in Function构造函数)。
  • vm可以在多个调用之间重用上下文runInContext https://nodejs.org/api/vm.html#vm_script_runincontext_contextifiedsandbox_options. new Function可以使用参数重复使用相同的上下文。

然而,一个简单的基准测试显示了两者之间相当显着的性能差异vm and new Function。因此,我假设它们的运作方式存在根本差异。

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


我知道有一个类似的问题(Node.JS vm.runInNewContext() 与 require() 和 eval() https://stackoverflow.com/questions/9867069/node-js-vm-runinnewcontext-vs-require-and-eval/9872462)。然而,这个问题已经涉及到讨论之间的区别eval and require。它没有解决之间的区别eval and vm module.


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

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

So:

  • eval可以访问全局变量和局部变量
  • new Function可以访问全局变量,但不能访问局部变量
  • vm.runInThisContext()可以访问相同的new Function can
  • vm.runInNewContext()甚至无法访问全局变量,例如console

The vm函数具有一些附加功能,例如能够传递超时来限制代码的运行时间。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

new Function 和 vm 有什么区别? 的相关文章

随机推荐

  • 查找元素更改值的索引 pandas dataframe

    关于这个问题 答案 https stackoverflow com questions 19125661 find index where elements change value numpy 有没有一种方法可以为 pandas 数据帧结
  • 进度条适用于 Android API 23,但不适用于 21 或 22

    这是 xml 部分
  • 重新发明标签控件

    我需要从头开始重新发明 重新创建标签控件 以添加我自己的魔力 是的 我知道你在想什么 如果你不这么想 你不应该这样想吗 有人能指出我正确的方向吗 谢谢 重新创建标签的全部目的是我想要完全控制它如何绘制到屏幕上 这样我也可以拥有它的 KeyD
  • ILMerge 问题错误代码 1

    我知道 ilmerge 是一个控制台应用程序 但当我运行它时 它运行一秒钟然后关闭 下面是我尝试使用的预构建代码 它给出了这个问题 Error 1 The command ilmerge out F Users Tom Desktop Ne
  • Cocoa osx NSTableview 改变行高亮颜色

    在我的应用程序中 我有一个基于视图的 NSTableView 其中有一列 行的突出显示颜色设置为常规 蓝色 我需要将该颜色更改为我的自定义颜色 在界面生成器中 我尝试更改它 但唯一的选项是 无 常规和源列表 我尝试了这个帖子解决方案但没有成
  • 将算法从 C# 转换为 VB.NET 失败

    我正在尝试将以下算法从 C 转换为 VB NET 但我所拥有的 VB NET 生成的结果与我的 C 算法不同 有人可以告诉我在转换过程中哪里出了问题吗 public static IEnumerable
  • Makie:散点图的非重叠标签放置算法

    我使用 CairoMakie 散点图 XY 数据集 但使用标签作为标记 using CairoMakie x 0 0 5 0 50 y 0 0 5 0 51 lbls O A B fig Figure ax Axis fig 1 1 sca
  • 如何在 Ubuntu 15.10 中将 Robomongo 从 tar.gz 文件安装为程序

    如今 robomongo 开发人员发布了 robomongo 的新版本tar gz not in deb易于双击安装的软件包 但该选项不再可用 那么如何将其安装为Ubuntu中的程序 我尝试解压软件包并安装但失败 admin admin l
  • 该代理的会话已存在

    我正在使用 TFS 执行夜间构建 其中包括使用TFS测试代理 https www visualstudio com en us docs test lab management test machines install configure
  • 使用 Java 将宏添加到 Excel 电子表格

    我正在开发一个创建 Excel 电子表格的应用程序 我正在使用 Javadocx4j http dev plutext org trac docx4j库 但它没有宏支持 因为它不是通过 Open XML API 提供的 我只是想知道是否有人
  • 带有可选参数的智能 URL?

    我目前在我的 htaccess 文件中包含以下内容 RewriteEngine On RewriteBase RewriteCond REQUEST FILENAME f RewriteCond REQUEST FILENAME l Rew
  • 将不同的嵌入结构投影到相同的名称

    我正在编写一个执行这些任务的 python 脚本 查询带有嵌入文档的 MongoDB 集合 聚合和项目更改查询中返回的字段名称以匹配 u 约定 通过 REST API 将值导入到 ServiceNow ISSUE 嵌入的文档结构不一致 HO
  • 通用简单 3D 矩阵旋转问题

    我的 3D 对象旋转有问题 它是用 java 编写的 但这并不重要 的背景 我有一个简单的 3D 模型 您是其中的第一人称玩家 您向上移动鼠标以向上看 即按 3D 的 x 轴旋转 向下移动鼠标以向下看 沿相反方向旋转 But 我还有左 右箭
  • android.os.Build.SERIAL 是唯一的吗?

    我想为适用于手机和平板电脑的 Android 设备使用唯一的 ID IMEI 不适用于没有 SIM 卡的设备 有时 MAC 地址返回 null 我不确定 android os Build SERIAL 是否唯一 有人知道这件事吗 谢谢 问候
  • Eclipse 缺少数据库连接

    我在 Eclipse 中缺少 MySQL 和其他连接配置文件 因此 JBoss 服务器会抛出错误 由于声誉问题 无法发布图片 我只有 通用 JDBC HSQLDB 使用 Eclipse Kepler 和 jboss eap 6 1 已经在我
  • 使用 C 获取操作系统名称 [Linux,可移植发行版:Centos、Debian、Fedora、OpenSUSE、RedHat、Ubuntu]

    我知道我可以使用这个简单的命令检查我的操作系统名称 lsb release ds 但我也知道 它不能在我需要的所有平台上移植 我试过struct utsname info and uname info 它工作得很好 但只给了我 基本 名称
  • 在 ggplot2 r 中操作 geom_bar 和 coord_polar 的描绘

    我正在 ggplot 中使用 Polar coord 构建同心圆图表 我需要删除特定的线 这是代码和情节 df lt data frame A letters 1 12 B c rep Dim 1 4 rep Dim 2 4 rep Dim
  • 实例化(子)类时,您将对象声明为什么“类型”有什么区别吗?

    假设我有一个名为ParentClass和一个名为ChildClass The ParentClass是抽象的 并且ChildClass延长了ParentClass根据 Java 术语 此外 ParentClass有一个构造函数 它需要一个i
  • 使用 sed/awk 打印具有匹配模式或另一个匹配模式的行

    我需要打印文件中与模式匹配的行OR使用不同的模式awk questions tagged awk or sed questions tagged sed 我觉得这是一项容易的任务 但我似乎找不到答案 有任何想法吗 POSIX 方式 awk
  • new Function 和 vm 有什么区别?

    我想知道两者之间有什么区别新功能 https developer mozilla org en US docs Web JavaScript Reference Global Objects Function 实际上 eval https