eval() 和 new function()

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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容