一尘不染

eval()和new Function()是同一件事吗?

javascript

这两个功能在后台执行相同的操作吗?(在单条语句中)

var evaluate = function(string) {
    return eval('(' + string + ')');
}

var func = function(string) {
    return (new Function( 'return (' + string + ')' )());
}

console.log(evaluate('2 + 1'));
console.log(func('2 + 1'));

阅读 309

收藏
2020-04-25

共1个答案

一尘不染

不,他们 一样。

  • eval() 在当前执行范围内将字符串评估为JavaScript表达式,并且可以访问局部变量。
  • new Function()将存储在字符串中的JavaScript代码解析为一个函数对象,然后可以调用该对象。它无法访问局部变量,因为代码在单独的范围内运行。

考虑以下代码:

function test1() {
    var a = 11;
    eval('(a = 22)');
    alert(a);            // alerts 22
}

如果new Function('return (a = 22);')()使用,则局部变量a将保留其值。但是,诸如Douglas
Crockford之类的一些JavaScript程序员认为,除非绝对必要,否则都不应该使用它们,并且对不可信数据进行逃避/使用构造函数是不安全且不明智的。Function

2020-04-25