文档章节

动态执行javascript代码的几种方法介绍

卢勇福
 卢勇福
发布于 2015/04/02 23:40
字数 530
阅读 1192
收藏 29

在nodejs里面我们要用js来执行js,大概有这几个方式:

1.runInThisContext

我们先看代码和输出:


var vm = require('vm');
var localVar=1;
globalVar = 0;
var script = vm.createScript('globalVar += 1;localVar=3', 'this.vm');
for (var i = 0; i < 1000 ; i += 1) {
    script.runInThisContext();
}
console.log(globalVar);
console.log(localVar);
console.log(global.localVar);

代码输出:


1000
1
3



从这里我们可以看到runInThisContext是不能访问本地作用域的,但是可以访问golbal(nodejs全局作用域),所以它改变globalVar为1000,而本地localVarl=3相当于在global作用域里声明里一个localVar变量并设置为3.本地作用域里的localVar则继续为1.


2.runInNewContext

我们再看代码和输出:


var vm = require('vm');
var localVar=1;
globalVar = 0;
var sandbox = { sanboxVar:0 };
var scriptNew=vm.createScript('sanboxVar += 1;globalVar=4;var x=2;', 'new.vm');
for (var i = 0; i < 1000 ; i += 1) {
    scriptNew.runInNewContext(sandbox);
}
console.log(sandbox.sanboxVar);
console.log(sandbox.globalVar);
console.log(sandbox.x);
console.log(globalVar);



代码输出:


1000
4
2
0



我们看到runInNewContext则是完全在一个新的作用域里面执行代码,即不能访问本地作用域,也不能访问全局作用域,但是可以通过传入一个沙箱来获取一些执行结果,比如这里'sanboxVar += 1;globalVar=4;var x=2;',无论是在sandbox被传入的sanboxVar属性,还是globalVar这样直接赋值的变量或者新建并赋值的变量x,最后都被设置成了sanbox的属性。

3.eval


最后我们看看eval的代码:


var localVar=1;
globalVar = 0;
eval('globalVar=3;localVar=2');
console.log(globalVar);
console.log(localVar);



代码输出


3
2



说明eval既可以访问本地作用域,也可以访问global全局作用域,上面的代码其实跟:


var localVar=1;
globalVar = 0;
globalVar=3;localVar=2;
console.log(globalVar);
console.log(localVar);



这个代码完全一样,就跟直接执行js一样。

好了,到这里基本上说明白用 runInThisContext,runInNewContext,eval三种方式执行代码的异同,大家可以根据自己的需求来选择使用:)

扫描下面二维码图片选择“识别图中二维码”关注帝都码仔公众号:

© 著作权归作者所有

共有 人打赏支持
卢勇福

卢勇福

粉丝 39
博文 19
码字总数 22106
作品 9
海淀
高级程序员
加载中

评论(1)

幻视Vision
幻视Vision
哈哈,搜索 帝都码仔 出来的全是赌场什么的。
高性能Javascript--脚本的无阻塞加载策略

Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题。 在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 。原因是,事实上,大多数浏览器使用单进程处理UI和更...

Junn
2014/10/10
0
2
JavaScript的基本使用

一、JavaScript的简单介绍   JavaScript是一种属于网络的脚本语言(简称JS),已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaS...

码农47
03/15
0
0
JavaScript的性能优化:加载和执行

js最大的问题是:无论当前JavaScript代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成。JavaScript执行过程耗时越久,浏览器等待响应用户输入的时间就越长。浏览器...

EDIAGD
2013/09/07
0
14
Javascript的匿名函数

一、什么是匿名函数? 在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: 函数字面量(Function Literals): Function()构造函数: 上面三种方法定义了同一个方法函数...

solu
2010/12/26
0
0
异步加载script,提高前端性能(defer和async属性的区别)

一、异步加载script的好处 为了加快首屏响应速度,前端会采用代码切割、按需加载等方式优化性能。异步加载script也是一种前端优化的手段。 就好比如果我的页面其中一个功能需要打开地图,但是地...

xiaobe
08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

spring只

一、IOC(Inversion of Control)或者依赖注入(Dependency Injection) 1、底层实现原理:反射 2、三大核心接口: BeanFactory:简单容器系列,只是实现了容器最基本的功能。 ApplicationC...

狠一点
4分钟前
0
0
缓存架构SpringBoot集成Curator实现zookeeper分布式锁

一、分布式锁简介 1、什么是锁 在单机环境下,当存在多个线程可以同时改变某个共享变量时,就需要同步来实现该功能,使其线程安全。 而同步就是通过锁来实现的。锁保证了同一时刻只有一个线程...

架构师springboot
6分钟前
0
0
11《Java核心技术》之Java提供了哪些IO方式? NIO如何实现多路复用?

一、提出问题 IO 一直是软件开发中的核心部分之一,伴随着海量数据增长和分布式系统的发展,IO 扩展能力愈发重要。幸运的是,Java 平台 IO 机制经过不断完善,虽然在某些方面仍有不足,但已经...

飞鱼说编程
13分钟前
0
0
简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。 War是...

linuxprobe16
13分钟前
0
0
55:Mysql用户管理|常用sql语句|mysql数据库备份恢复

1、Mysql用户管理; 场景,为了安全,新建的站点,创建新的用户,或者给已有用户授权,对某个库或者某个表有权限; 语法: grant all on *.* to 'user'@'127.0.0.1' identified by 'password'; g...

芬野de博客
17分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部