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实现获取当前url地址及url各种参数值
Jun 25 NodeJs
Nodejs中的this详解
Mar 26 NodeJs
Windows 系统下设置Nodejs NPM全局路径
Apr 26 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
nodejs的路径问题的解决
Jun 30 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 NodeJs
详解NodeJS模块化
Jun 15 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
php实现事件监听与触发的方法
2014/11/21 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
有关json_decode乱码及NULL的问题
2015/10/13 Javascript
js解决movebox移动问题
2016/03/29 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
值得收藏的10道python 面试题
2019/04/15 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
2019/05/07 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
师范应届毕业生自荐信
2013/11/18 职场文书
中班开学寄语
2014/04/04 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
美术课外活动总结
2014/07/08 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL