美文网首页
eval() 和 new function()

eval() 和 new function()

作者: 尤樊容 | 来源:发表于2017-07-13 16:28 被阅读31次

    eval()和new function()的功能基本相似:将字符串解析成js可以看懂的语言,即将字符串当做代码来执行(动态解析和执行字符串)。

    基本使用:
         var str='{a:1,b:2,c:3}';
        console.log(eval('('+str+')').c);
    
        var str="{a:1, b:2, a:3}";
        var show=new Function("return"+str)();
        console.log(show.b);
    

    需要注意的是:使用eval读json的时候必须加上带有引号的括号和字符串拼接,否则将会报错。使用new Function()的时候也不能忘了将return拼接进去,最后的括号不要忘记了。

    区别:

    1、作用域不同。在以下例子中eval()和new Function()同样都是解析的字符串str1,但是结果却是不一样,eval访问的是局部变量,new Function则访问的是全局变量。

        var str = "111";
        function show(){
            var str = "222";
            var str1 = "console.log(str)";
            eval(str1);//222
            new Function("return " + str1)();//111 注:因为return后面的语句要执行所以在    return后面加上空格
        }
        show();
    

    2、eval可以改变原来存在的变量值,new Function不能改变,因为var a = "999";是函数内部的局不变量,不会影响到全局的变量值。

        var a = "666";
        eval("var a = '888';");
        console.log(a);
    
        new Function("var a = '999';")();
        console.log(a);
    
    性能:

    在执行速度上eval相对快一点,但是经过上面的分析new Function相对安全,建议使用。

            var str='{a:1,b:2,c:3}';
            var timeS = Date.now();
            for(var i = 0;i < 10000;i++){
                eval('('+str+')');
            }
            var timeE = Date.now();
            console.log(timeE - timeS);//202(Google)  1251(FF)  8(IE11)
    
            var str='{a:1,b:2,c:3}';
            var timeS = Date.now();
            for(var i = 0;i < 10000;i++){
                new Function("return " + str)();
            }
            var timeE = Date.now();
            console.log(timeE - timeS);//271(Google)  2057(FF)  12(IE11)
    

    相关文章

      网友评论

          本文标题:eval() 和 new function()

          本文链接:https://www.haomeiwen.com/subject/wqfjqxtx.html