eval()和new Function()是一样的吗?

这两个功能在幕后做了同样的事情吗? (在单个语句函数中)

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'));

不,他们一样。

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

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

    如果使用new Function('return (a = 22);')() ,局部变量a将保留其值。 尽管如此,一些JavaScript程序员,例如道格拉斯克罗克福德认为,除非绝对必要,否则不应该使用,并且对不可信数据评估/使用Function构造Function是不安全和不明智的。


    没有。

    在你的更新中, evaluatefunc的调用会产生相同的结果。 但是,他们绝对不是“在幕后做同样的事情”。 func函数创建一个新函数,但是立即执行它,而evaluate函数只是在现场执行代码。

    从原来的问题来看:

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

    这些会给你非常不同的结果:

    evaluate('0) + (4');
    func('0) + (4');
    

    new Function创建一个可重用的函数。 eval只是执行给定的字符串并返回最后一条语句的结果。 当您试图创建一个使用函数来模拟eval的包装函数时,您的问题被误导了。

    他们在窗帘背后分享了一些代码是真的吗? 是的,很可能。 完全相同的代码? 不,当然。

    为了好玩,这里是我自己使用eval创建函数的不完美实现。 希望它能让我们看到差异!

    function makeFunction() {
      var params = [];
      for (var i = 0; i < arguments.length -  1; i++) {
        params.push(arguments[i]);
      }
      var code = arguments[arguments.length -  1];
    
    
     // Creates the anonymous function to be returned
     // The following line doesn't work in IE
     // return eval('(function (' + params.join(',')+ '){' + code + '})');
     // This does though
     return eval('[function (' + params.join(',')+ '){' + code + '}][0]');
    }
    

    这个函数与新函数最大的区别在于函数不是词法范围的。 所以它不会访问关闭变量,也不会。

    链接地址: http://www.djcxy.com/p/16987.html

    上一篇: Are eval() and new Function() the same thing?

    下一篇: Javascript equivalent of Python's locals()?