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极简入门教程(一):模块机制
Oct 25 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
初识NodeJS服务端开发入门(Express+MySQL)
Apr 07 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
php.ini中的php-5.2.0配置指令详解
2008/03/27 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
php excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
jQuery 白痴级入门教程
2009/11/11 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
python基础教程之实现石头剪刀布游戏示例
2014/02/11 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
Python list与NumPy array 区分详解
2019/11/06 Python
python数值基础知识浅析
2019/11/19 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
django使用多个数据库的方法实例
2021/03/04 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
车间操作工岗位职责
2013/12/19 职场文书
大学生写自荐信的技巧
2014/01/08 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
秋天的图画教学反思
2014/05/01 职场文书
市场营销策划方案
2014/06/11 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书