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 文本操作模块-fs模块(三)
Dec 22 NodeJs
详解Nodejs的timers模块
Dec 22 NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
在nodejs中创建child process的方法
Jan 26 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 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 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
抓取并下载CSS中所有图片文件的php代码
2011/09/26 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
php格式化金额函数分享
2015/02/02 PHP
PHP文件操作方法汇总
2015/07/01 PHP
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
关于js注册事件的常用方法
2013/04/03 Javascript
卸载安装Node.js与npm过程详解
2016/08/15 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
2018/09/20 jQuery
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
python 生成不重复的随机数的代码
2011/05/15 Python
python实现Flappy Bird源码
2018/12/24 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Python实现数字的格式化输出
2020/08/01 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
硕士研究生自我鉴定范文
2013/12/27 职场文书
售后服务承诺书范文
2014/03/26 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
通信工程求职信
2014/07/16 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
Go gorilla/sessions库安装使用
2022/08/14 Golang