eval()和new function()的功能基本相似:將字符串解析成js可以看懂的語(yǔ)言,即將字符串當(dāng)做代碼來(lái)執(zhí)行(動(dòng)態(tài)解析和執(zhí)行字符串)统屈。
基本使用:
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的時(shí)候必須加上帶有引號(hào)的括號(hào)和字符串拼接仑荐,否則將會(huì)報(bào)錯(cuò)码俩。使用new Function()的時(shí)候也不能忘了將return拼接進(jìn)去昙衅,最后的括號(hào)不要忘記了扬霜。
區(qū)別:
1、作用域不同而涉。在以下例子中eval()和new Function()同樣都是解析的字符串str1著瓶,但是結(jié)果卻是不一樣,eval訪問(wèn)的是局部變量啼县,new Function則訪問(wèn)的是全局變量蟹但。
var str = "111";
function show(){
var str = "222";
var str1 = "console.log(str)";
eval(str1);//222
new Function("return " + str1)();//111 注:因?yàn)閞eturn后面的語(yǔ)句要執(zhí)行所以在 return后面加上空格
}
show();
2、eval可以改變?cè)瓉?lái)存在的變量值谭羔,new Function不能改變,因?yàn)関ar a = "999";是函數(shù)內(nèi)部的局不變量麦向,不會(huì)影響到全局的變量值瘟裸。
var a = "666";
eval("var a = '888';");
console.log(a);
new Function("var a = '999';")();
console.log(a);
性能:
在執(zhí)行速度上eval相對(duì)快一點(diǎn),但是經(jīng)過(guò)上面的分析new Function相對(duì)安全诵竭,建議使用话告。
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)