Javascript之eval与new Function的差异

当你必须要将字符串当做代码来执行,很多人第一印象是想到使用eval, 但实际上,使用new Function会更安全 。

为什么安全? 看个例子。

<script>
  var a = 1;
  
  eval("var a=2;");   //改变了当前域的变量a
  alert(a);
  
  new Function("var a=3;")();   //不改变当前作用域的变量
  alert(a);
</script>
  

eval能够影响当前作用域及所有的父作用域的变量, 而new Function 它是运行在一个独立的function内, 并且他的父作用域是window而不是当前作用域。 我们再来看个例子。

<script>
     var a = 1,
	     a1 = 1;
	 function t(){
	      var b = 1,
              b1 = 1;
	      !function(){      //立即执行函数
		      eval("a=2;b=2;");
		      alert(a);
		      alert(b);

          
		      new Function("a1=2;b1=2;")();
		      alert(a1);
		      alert(b1);
              }();
	 }
	 t();
</script>

可能有人会说:new function 是隔离于当前作用域的。 那我如何获取到 字符串当做代码运行之后的值呢 ? 比如一个经典的应用,将json字符串 转化为 对象字面量

如 var b = {"a":"b"} 你可以直接加个return, 如 var c = new Function("return "+b)(); 这样c就是一个相同格式的对象了。

经验分享 程序员 微信小程序 职场和发展