动态执行javascript代码的几种方法介绍
动态执行javascript代码的几种方法介绍
卢勇福 发表于3年前
动态执行javascript代码的几种方法介绍
  • 发表于 3年前
  • 阅读 1097
  • 收藏 29
  • 点赞 2
  • 评论 1

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 动态执行javascript代码的几种方法介绍 runInThisContext,runInNewContext,eval

在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
博文 18
码字总数 21951
作品 9
评论 (1)
幻视Vision
哈哈,搜索 帝都码仔 出来的全是赌场什么的。
×
卢勇福
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: