我想知道两者之间有什么区别新功能 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(使用前将#替换为@)