许多人认为eval()方法是邪恶(evil)的。这个方法可以把任意字符串当成Javascript代码来执行。我们应该尽可能的不用eval()方法。比如,可以使用方括号来得到对象属性的值:

// antipattern
var property = "name";
alert(eval("obj." + property));
// preferred
var property = "name";
alert(obj[property]);

另外,JavaScript的setInterval()和setTimeout()方法也有类似的问题。这时也应该避免把字符串当成参数传递给这些方法:

// antipatterns
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);
// preferred
setTimeout(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
}());

最新文章

  1. poj[1187][Noi 01]陨石的秘密
  2. LoadScript
  3. document.cookie打不出来cookies
  4. 在相同的主机上创建一个duplicate数据库
  5. 实际工作中遇到的一些css
  6. cf445B DZY Loves Chemistry
  7. uva10465(完全背包,要求装满背包)
  8. 第十七篇 基于Bootstarp 仿京东多条件筛选插件的开发(展示下)
  9. 小米/红米导入VCF联系人乱码问题解决
  10. 调试利器GDB(上)
  11. 您还差宝贝一张语文教学光盘!教你如何制作ISO文件
  12. 2017-2018-2 20155303『网络对抗技术』Exp7:网络欺诈防范
  13. 使用 Python 把多个 MP4 合成一个视频(转)
  14. jmeter测试计划配置
  15. 同时装有py2 和3,运行scrapy如何区分
  16. (转载)使用curl 和 libjson 完成联网和数据解析
  17. AWS S3
  18. 深度学习方法:受限玻尔兹曼机RBM(四)对比散度contrastive divergence,CD
  19. Read Large Files in Python
  20. C#导出Excel-利用特性自定义数据

热门文章

  1. Java实现 LeetCode 482 密钥格式化
  2. java实现第五届蓝桥杯供水设施
  3. java实现第七届蓝桥杯压缩变换
  4. portapack h1 买回来刷hackrf与使用说明
  5. redis 分布式锁的简单使用
  6. Hive的压缩存储和简单优化
  7. Spring源码之自动装配
  8. 实验二 Linux系统简单文件操作命令
  9. [转] 浅谈C++中的那些内存泄露
  10. 小师妹学JavaIO之:用Selector来发好人卡