避免使用eval()

eval()可以将任意的字符串当做一个JavaScript代码来执行。

eval()使用实例:

    // 烦模式
    var property = 'name';
    console.log(eval('obj.'+property));
    //推荐方法
    var property = 'name';
    console.log(obj[property]);

使用简单的方括号将需要访问的动态属性括起来

使用eval()包含一些安全隐患,因为可以动态的修改传入eval()内部的字符串,并执行。

2、牢记通过setInterval()、setTimeout、和function()等构造函数来传递参数

  //反模式
    setTimeout('myfn()',3000);
    setTimeout('myfn(1,2,6)',3000);
    //推荐模式
    setTimeout(myfn,3000);
    setTimeout(function(){
        myfn(1,2,6);
    },3000)

使用new Function()构造函数和eval()比较类似,如果一定要使用eval(),可以使用new Function()来代替eval()。这样做的好处是new Function()中的代码将在局部函数空间中运行,可以避免生成全局变量,避免自动生成成为全局变量的方法是将eval()调用封装到一个即时函数中:

  console.log(typeof a);//未定义
    console.log(typeof b);//未定义
    console.log(typeof c);//未定义

    var s1 = 'var a = 1;console.log(a);';
    eval(s1);//1
    var s2 = 'var b = 2;console.log(b);';
    new Function(s2)();//2
    var s3 = 'var c = 3;console.log(c);';
    (function(){
        eval(s3);
    })();//3

    console.log(typeof a);//number
    console.log(typeof b);//undefined
    console.log(typeof c);//undefined

所以用new Function()和(function(){eval('内容')})() 的作用是一样。

都是形成了内部函数,内部变量,如果单独使用eval()会产生全局变量

new Function 和 Function 是一样的

Function就像一个沙盒不能修改和访问它的作用域以外的变量,但是eval()可以

(function(){
        var a = 23;
        eval('a = 6;console.log(a);');//6
        console.log(a);//6
    })();
    (function(){
        var b = 56;
        Function('console.log(b);')();//undefined
    })();

猜你喜欢

转载自www.cnblogs.com/jokes/p/9459920.html