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 })();