Skip to content

eval 和 new Function 的区别

evalnew Function 都可以动态解析和执行字符串。但是它们对解析内容的运行环境判定不同。

js
let foo = 'foo';
function bar() {
  let foo = 'bar';
  eval('console.log(foo)'); // 输出bar
  new Function('console.log(foo)')(); // 输出foo
}
bar();

同样都有安全问题。

eval()Function 构造不同的是 eval()可以干扰作用域链,而 Function()更安分守己些。不管你在哪里执行 Function(),它只看到全局作用域。所以其能很好的避免本地变量污染。在下面这个例子中,eval()可以访问和修改它外部作用域中的变量,这是 Function 做不来的(注意到使用 Functionnew Function 是相同的)。

js
function bar() {
  let obj = { age: 18 };
  eval('obj.age = 20');
  new Function('obj.age = 30')();
  console.log(obj); // { age: 20 }
}

Released under the MIT License.