许多人认为eval()方法是邪恶(evil)的。这个方法可以把任意字符串当成Javascript代码来执行。我们应该尽可能的不用eval()方法。比如,可以使用方括号来得到对象属性的值:
// antipatternvar property = "name";alert(eval("obj." + property));// preferredvar property = "name";alert(obj[property]);
另外,JavaScript的setInterval()和setTimeout()方法也有类似的问题。这时也应该避免把字符串当成参数传递给这些方法:
// antipatternssetTimeout("myFunc()", 1000);setTimeout("myFunc(1, 2, 3)", 1000);// preferredsetTimeout(myFunc, 1000);setTimeout(function () { myFunc(1, 2, 3);}, 1000);
new Function()作为函数的声名方式,也可以接受字符串作为参数,但这也是应该避免的。new Function()和eval()的区别是,eval()执行的代码中的变量将“变成”全局变量,但new Function()则不然。
console.log(typeof un); // "undefined"console.log(typeof deux); // "undefined"console.log(typeof trois); // "undefined"var jsstring = "var un = 1; console.log(un);";eval(jsstring); // logs "1"jsstring = "var deux = 2; console.log(deux);";new Function(jsstring)(); // logs "2"jsstring = "var trois = 3; console.log(trois);";(function () { eval(jsstring);}()); // logs "3"console.log(typeof un); // "number"console.log(typeof deux); // "undefined"console.log(typeof trois); // "undefined"
另外,eval()中的字符串代码可以访问程序中的全局变量,而new Function则不然。需要注意的是Function和new Function效果完全相同:
(function () { var local = 1; eval("local = 3; console.log(local)"); // logs 3 console.log(local); // logs 3}());(function () { var local = 1; Function("console.log(typeof local);")(); // logs undefined}());