文档章节

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

卢勇福
 卢勇福
发布于 2015/04/02 23:40
字数 530
阅读 1222
收藏 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三种方式执行代码的异同,大家可以根据自己的需求来选择使用:)

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

© 著作权归作者所有

共有 人打赏支持
卢勇福

卢勇福

粉丝 40
博文 19
码字总数 22106
作品 10
海淀
高级程序员
私信 提问
加载中

评论(1)

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

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

Junn
2014/10/10
0
2
了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult

在之前的两篇文章(《EmptyResult & ContentResult》和《FileResult》)我们剖析了EmptyResult、ContentResult和FileResult这三种ActionResult是如何将Action执行的结果响应给客户端的。本篇...

长平狐
2012/09/04
1K
0
网页性能优化之异步加载js文件

一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件。在谈异步加载之前,先来看看浏览器加载js文件的原理。 浏览器加载 JavaScript 脚本,主要通过元素完成。...

酥风
10/23
0
0
JavaScript的基本使用

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

码农47
03/15
0
0
异步加载script,提高前端性能(defer和async属性的区别)

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

xiaobe
08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
36分钟前
5
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
37分钟前
3
0
my.ini

1

architect刘源源
53分钟前
4
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
5
0
寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部