虽然eval()函数有这个功能,但我们还是尽量避免,能用就尽量不用。eval的执行环境是混乱的,它会寻找当前的执行上下文而造成混乱。letc=1;letd=eval(`module.exports=function(a,b){returna+b+c}`)console.log(d(1,2))//4也会输出c到Function而不是eval()方法是newFunction,即window.Function,不受上下文作用域影响letz=3;leta='vara=1;returnx+y+z';//最后一个参数是一个字符串,前一个参数是一个function形参letfn=newFunction("x","y","z",a);console.log(fn.toString());//functionanonymous(x,y,z){vara=1;returnx+y+z}//console.log(fn(1,2));//NaN//console.log(fn(1,2,3));//6vm[2]vm.runInThisContext()中当前在全局上下文中运行代码并返回结果。运行代码无法访问局部作用域,但可以访问当前全局对象。constvm=require('vm');constvmResult=vm.runInThisContext('localVar="vm";');console.log(vmResult)//vmconsole.log(localVar)//vmconstvm=require('vm');letlocalVar='initialvalue';constvmResult=vm.runInThisContext('localVar="vm";');console.log(`vmResult:'${vmResult}',localVar:'${localVar}'`);//打印:vmResult:'vm',localVar:'initialvalue'constevalResult=eval('localVar="eval";');console.log(`evalResult:'${evalResult}',localVar:'${localVar}'`);//Prints:evalResult:'eval',localVar:'eval'因为vm.runInThisContext()没有访问本地作用域的权限,所以localVar没有改变。相比之下,eval()确实可以访问本地范围,从而更改值localVar。
