您的位置:首页 > Web前端 > JavaScript

javascript eval函数详细说明与兼容处理

2015-03-01 21:54 337 查看
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。 语法 eval(string)参数 描述 string 必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

语法

eval(string)参数 描述

string 必需。要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。

返回值

通过计算 string 得到的值(如果有的话)。

先来说eval的用法,内容比较简单,熟悉的可以跳过。

eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行结果是一个值,则返回此值,否则返回undefined。

需要特别注意的是对象声明语法“{}”并不能返回一个值,需要用括号括起来才会返回值,简单示例如下:

var code1='"a" + 2'; //表达式

var code2='{a:2}'; //语句

alert(eval(code1)); //->'a2'

alert(eval(code2)); //->undefined

alert(eval('(' + code2 + ')')); //->[object Object]

无论是变量定义还是函数定义都是如此,所以如下的代码会产生函数未定义的错误:

var s='function test(){return 1;}'; //一个函数定义语句

function demo2(){

eval(s);

}

demo2();

alert(test()); //->error:test is not defined

可以同时兼容IE和Firefox,方法如下:

var X2={} //my namespace:)

X2.Eval=function(code){

if(!!(window.attachEvent && !window.opera)){

//ie

execScript(code);

}else{

//not ie

window.eval(code);

}

}

现在如果要想在函数内定义全局代码,就可以通过调用X2.Eval(code)方法,一个例子如下:

var s='global';

function demo3(){

X2.Eval('var s="local"');

}

demo3();

alert(s); //->'local'

说明

该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。

如果试图覆盖 eval 属性或把 eval() 方法赋予另一个属性,并通过该属性调用它,则 ECMAScript 实现允许抛出一个 EvalError 异常。

IE 当eval遇上function的处理

情况1:eval里没有function,直接执行:

eval("alert('ss');");//所有浏览器正确均输出

情况2:eval里有function,function立即执行:

eval("(function(){alert('ss');})();");//所有浏览器正确输出

情况3:eval里有function,使用变量保存function引用并调用该function:

var f=eval("(function(){alert('ss');})");

f();//IE下报错:缺少对象 其他浏览器正常

当在eval定义一个function并返回给变量时,IE报错:缺少对象。可见IE下eval里定义的function并不能成功返回到eval外部。

解决方法:使function对象作为一个执行结果返回:

方法1:

var f=eval("(function(){ return function(){alert('ss');}})()");

f();//所有浏览器正确输出

eval里调用一个立即执行的函数,该函数执行之后返回一个function对象,此时该function对象的引用成功返回到外部变量。

方法2:

var f=eval("(false||function(){alert('ss');})");

f();//所有浏览器成功输出

该方法也是jquery里使用的方法,function作为或表达式的执行结果返回,同样能成功解决问题。当然,表达式并不局限于上面的false||function(){},各种表达式只要能成功返回function,均可解决问题:

/* 与表达式:*/

var f=eval("(true&&function(){alert('ss');})");

f();//所有浏览器正常输出

/* 三元表达式:*/

var f=eval("(true?function(){alert('ss');}:'');");

f();//所有浏览器正常输出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: