zoukankan      html  css  js  c++  java
  • JavaScript基础避免使用eval()(006)

    许多人认为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
    }());
    
  • 相关阅读:
    ecshop中关于语言配置项的管理
    ecshop中猜你喜欢的原理
    CSS之Position详解(自cnblogs)
    包装类
    for循环的另一种写法
    date.calendar学习总结
    java对MySql数据访问
    java中对MySql的配置
    小程序在js里获取控件的两种方式
    样式一直没生效,发现css没加前面的小点!!!
  • 原文地址:https://www.cnblogs.com/Bryran/p/3969163.html
Copyright © 2011-2022 走看看