码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-04-03 01:40:00      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

在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三种方式执行代码的异同,大家可以根据自己的需求来选择使用:)

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

技术分享

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

标签:

原文地址:http://my.oschina.net/luyongfugx/blog/395455

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!