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爬虫进阶教程之异步并发控制
Feb 15 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
nodejs基础知识
Feb 03 NodeJs
nodejs入门教程六:express模块用法示例
Apr 24 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
ajax +NodeJS 实现图片上传实例
Jun 06 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
nodejs操作mongodb的填删改查模块的制作及引入实例
Jan 02 NodeJs
nodeJS服务器的创建和重新启动的实现方法
May 12 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
nodejs中实现用户注册路由功能
May 20 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
第八节 访问方式 [8]
2006/10/09 PHP
微盾PHP脚本加密专家php解密算法
2020/09/13 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
js tab效果的实现代码
2009/12/26 Javascript
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
js实现车辆管理系统
2020/08/26 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
Python基于高斯消元法计算线性方程组示例
2018/01/17 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
高中化学教学反思
2014/01/13 职场文书
经典公益广告词
2014/03/13 职场文书
网吧消防安全责任书
2014/07/29 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
自荐信怎么写
2015/03/04 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
php去除deprecated的实例方法
2021/11/17 PHP