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
    }());
    
  • 相关阅读:
    环境变量配置1
    Golang 类型转换,断言和显式强制转换
    Goland could not launch process: decoding dwarf section info at offset 0x0: too short 解决方案
    用puttygen工具把私钥id_rsa转换成公钥id_rsa.ppk
    JetBrains GoLand 2018 激活码/ 注册码(最新破解方法)
    Go学习笔记(只有链接)
    linux中的ftp命令
    Linux的学习之路
    like语句百分号前置会使用到索引吗?
    记录下每月生活开支
  • 原文地址:https://www.cnblogs.com/Bryran/p/3969163.html
Copyright © 2011-2022 走看看