NodeJs中的VM模块详解


Posted in NodeJs onMay 06, 2015

什么是VM?

VM模块是NodeJS里面的核心模块,支撑了require方法和NodeJS的运行机制,我们有些时候可能也要用到VM模板来做一些特殊的事情。

通过VM,JS可以被编译后立即执行或者编译保存下来稍后执行(JavaScript code can be compiled and run immediately or compiled, saved, and run later.)
VM模块包含了三个常用的方法,用于创建独立运行的沙箱体制,如下三个方法
vm.runInThisContext(code, filename);

此方法用于创建一个独立的沙箱运行空间,code内的代码可以访问外部的global对象,但是不能访问其他变量

而且code内部global与外部共享

var vm = require("vm");

 

var p = 5;

global.p = 11;

 

vm.runInThisContext("console.log('ok', p)");// 显示global下的11

vm.runInThisContext("console.log(global)"); // 显示global

 

console.log(p);// 显示5

vm.runInContext(code, sandBox);

此方法用于创建一个独立的沙箱运行空间,sandBox将做为global的变量传入code内,但不存在global变量

sandBox要求是vm.createContext()方法创建的sandBox

var vm = require("vm");

var util = require("util");

 

var window = {

    p: 2,

    vm: vm,

    console: console,

    require: require

};

 

var p = 5;

 

global.p = 11;

 

vm.createContext(window);

vm.runInContext('p = 3;console.log(typeof global);', window); // global是undefined

 

console.log(window.p);// 被改变为3

 

console.log(util.inspect(window));

vm.runInNewContext(code, sandbox, opt);

这个方法应该和runInContext一样,但是少了创建sandBox的步骤

比较

NodeJs中的VM模块详解

更为复杂的情形
如果runInContext里面执行runInThisContext会是怎么样,runInThisContext访问到的global对象是谁的?

如下代码将会怎么执行?

var vm = require("vm");

var util = require("util");

 

var window = {

    p: 2,

    vm: vm,

    console: console,

    require: require

};

 

window.global = window;

 

var p = 5;

 

global.p = 11;

 

vm.runInNewContext('p = 3;console.log(typeof global);require(\'vm\').runInThisContext("console.log(p)");', window);

runInThisContext里面的代码可以访问外部的global对象,但外面实际上不存在global对象(虽然有,但本质不是global对象),只要记住一点,runInThisContext只能访问最顶部的global对象就OK了

执行结果如下

object (global存在)

11 (顶部global的p)
NodeJs 相关文章推荐
NodeJS框架Express的模板视图机制分析
Jul 19 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 NodeJs
nodejs入门教程六:express模块用法示例
Apr 24 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
nodejs调取微信收货地址的方法
Dec 20 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
nodejs简单实现中英文翻译
May 04 #NodeJs
nodejs调用cmd命令实现复制目录
May 04 #NodeJs
nodejs通过phantomjs实现下载网页
May 04 #NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 #NodeJs
PHP和NodeJs开发的应用如何共用Session
Apr 16 #NodeJs
Nodejs学习笔记之测试驱动
Apr 16 #NodeJs
Nodejs学习笔记之入门篇
Apr 16 #NodeJs
You might like
跟我学Laravel之路由
2014/10/15 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
js中javascript:void(0) 真正含义
2020/11/05 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
AngularJS 事件发布机制
2018/08/28 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
Python计算回文数的方法
2015/03/11 Python
在Python下进行UDP网络编程的教程
2015/04/29 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Python实现的质因式分解算法示例
2018/05/03 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
阿里旅行:飞猪
2017/01/05 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
精伦电子Java笔试题
2013/01/16 面试题
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
六十岁生日答谢词
2014/01/10 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
出租车拒载检讨书
2015/01/28 职场文书
万里长城导游词
2015/01/30 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
MySQL 常见存储引擎的优劣
2021/06/02 MySQL