谈谈eval
1. eval的定义和基本用法:eval(string)
参数 -- 是要计算的字符串,其中包含要计算的js表达式或者要执行的语句
返回值 -- 通过计算string得到的值
说明 -- 该方法只接受原始字符串作为参数,否则将直接返回,所以不要传递String对象
如果试图覆盖eval属性或者把eval()方法赋予另一个属性,并通过该属性调用他,则抛出异常
抛出 -- 如果参数没有合法的表达式和语句,则抛出SyntaxError
如果非法调用eval(),则抛出EvalError
如果传递给eval()的js代码生成了一个异常,eval()将把该异常传递给调用者
2. 在函数内执行全局代码
(1).eval()函数动态执行的代码并不会创建新的作用域,其代码就是在当前的作用于执行的,因此eval()函数可以使用当前作用域的this和argument等对象
var s='global'; //定义一个全局变量 function demo1(){ eval('var s="local"'); } demo1(); alert(s); //->global
(1).对于IE浏览器,默认已经提供了这样的函数:execScript,用于在全局空间执行代码。
(2).对于Firefox浏览器,直接调用eval函数,则在调用者的空间执行;如果调用window.eval则在全局空间执行。
var X2={} //my namespace:) X2.Eval=function(code){ if(!!(window.attachEvent && !window.opera)){ //ie execScript(code); }else{ //not ie window.eval(code); } } var s='global'; function demo3(){ X2.Eval('var s="local"'); } demo3(); alert(s); //->'local'
3. eval和JSON
(1).eval函数试图去执行传入参数里的表达式或者合法的js语句,把最后一个表达式或者语句包含的值或者引用做为返回值
(2).JSON 和 对象字面量(Object Literals)的区别:JSON 的名字部分严格用引号+名字来表示。
(3).转化的JSON为JS对象时,需要将 JSON 字符串的外面包装一层园括号
若不加外层的括号,那么eval会将大括号做为JS代码块的开始结束标志,则{}北认为是执行了一句空语句
alert(eval("{}")); //return undefined alert(eval("({})")); //return [object Object]