在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三种方式执行代码的异同,大家可以根据自己的需求来选择使用:)
扫描下面二维码图片选择“识别图中二维码”关注帝都码仔公众号:
时间: 2024-10-13 00:27:34