全网最低价业务网站,湖南茶叶网站建设,用dede做网站去掉版权,人社局网站建设方案eval() 功能#xff1a;首先解释Javascript代码 然后执行它 用法#xff1a;Eval#xff08;codeString#xff09; codeString是包含有javascript语句的字符串#xff0c;在eval之后使用Javascript引擎编译。即#xff1a;eval函数可以把一个字符串当作一个javascript表… eval() 功能首先解释Javascript代码 然后执行它 用法EvalcodeString codeString是包含有javascript语句的字符串在eval之后使用Javascript引擎编译。即eval函数可以把一个字符串当作一个javascript表达式一样去执行它。 eval可以将字符串生成语句执行和SQL的exec()类似。 使用场合预先不知道要执行什么语句只有当条件和参数给时才知道执行什么语句这时候evaluate就派上用场了。 eg1 var theEval123; var theresulteval(23); alert(the Eval1 result is:theEval1and the result is:theresult); 如果运行程序看到结果字符串“23”被执行了。得到结果5. 例子eval(id _icon.src/imgs/collapse_up.gif); id是之前设定的参数而在双引号中的字符串则是需要编译的 引用: -------------------------------------------------------------------------------- function tophide(id) //id indicates menu { if (top.topframeset.rows 31,*) { top.topframeset.rows 86,*; eval(id _icon.src/imgs/collapse_up.gif); eval(id _icon.altCollapse The Head); head.style.display block } else { top.topframeset.rows 31,*; eval(id _icon.src/imgs/collapse_down.gif); eval(id _icon.altExpand The Head); head.style.display none } } 如果还是不明白深入认识javascript中的eval函数 发现为本文起一个合适的标题还不是那么容易呵呵所以在此先说明下本文的两个目的 1介绍javascript中的eval函数的用法 2如何在函数内执行全局代码 先来说eval的用法内容比较简单熟悉的可以跳过。 eval函数接收一个参数s如果s不是字符串则直接返回s。否则执行s语句。如果s语句执行结果是一个值则返回此值否则返回undefined。 需要特别注意的是对象声明语法“{}”并不能返回一个值需要用括号括起来才会返回值简单示例如下 var code1a 2; //表达式 var code2{a:2}; //语句 alert(eval(code1)); //-a2 alert(eval(code2)); //-undefined alert(eval(( code2 ))); //-[object Object] 可以看到对于对象声明语句来说仅仅是执行并不能返回值。为了返回常用的“{}”这样的对象声明语句必须用括号括住以将其转换为表达式才能返回其值。这也是使用JSON来进行Ajax开发的基本原理之一。在例子中可以清楚的看到第二个alert语句输出的是undefined而第三个加了括号后输出的是语句表示的对象。 现在来说本文的重点如何在函数内执行全局代码。为了说明这个问题先看一个例子 var sglobal; //定义一个全局变量 function demo1(){ eval(var slocal); } demo1(); alert(s); //-global 很好理解上面的demo1函数等价于function demo1(){var slocal;}其中定义了一个局部变量s。 所以最后的输出是global并不是什么奇怪的事情毕竟大家都能很清楚的区分局部变量和全局变量。 仔细体会一下可以发现eval函数的特点它总是在调用它的上下文变量空间也称为包closure内执行无论是变量定义还是函数定义都是如此所以如下的代码会产生函数未定义的错误 var sfunction test(){return 1;}; //一个函数定义语句 function demo2(){ eval(s); } demo2(); alert(test()); //-error:test is not defined 这是因为test函数在局部空间定义demo2函数内可以访问到外面就访问不到了。 而在实际的Ajax开发中有时我们需要从服务器动态获取代码来执行以减轻一次载入代码过多的问题或者是一些代码是通过Javascript自身生成的希望用eval函数来使其执行。 但这样的动态获取代码的工作一般在函数内完成比如 function loadCode(){ var codegetCode(); eval(code); } 可见eval不可能在全局空间内执行这就给开发带来了不少问题也看到过很多人为此郁闷。 不过现在偶终于找到了解决办法嘿嘿可以同时兼容IE和Firefox方法如下 var X2{} //my namespace:) X2.Evalfunction(code){ if(!!(window.attachEvent !window.opera)){ //ie execScript(code); }else{ //not ie window.eval(code); } } 现在如果要想在函数内定义全局代码就可以通过调用X2.Eval(code)方法一个例子如下 var sglobal; function demo3(){ X2.Eval(var slocal); } demo3(); alert(s); //-local 可见在demo3函数内重新定义了全局变量slocal。 需要注意的是X2.Eval并不返回值如果要进行表达式的求值还是用系统的eval函数。X2.Eval设计为仅做全局代码定义用。 其实看到这里或许有人感觉问题也太容易解决了点呵呵但发现这个办法倒是需要些运气和技巧的 1对于IE浏览器默认已经提供了这样的函数execScript用于在全局空间执行代码只是知道的人还不多。 2对于Firefox浏览器直接调用eval函数则在调用者的空间执行如果调用window.eval则在全局空间执行。这个知道的人估计就更少了。毕竟alert(evalwindow.eval)返回true Firefox的eval函数的特点的确是很令人奇怪的但从javascript规范中倒也能找到其来源 If value of the eval property is used in any way other than a direct call (that is, other than by the explicit use of its name as an Identifier which is the MemberExpression in a CallExpression), or if the eval property is assigned to, an EvalError exception may be thrown. 意思大概就是说eval函数的执行是和调用者相关的但并没有说其执行上下文的问题。所以IE和Firefox孰是孰非也就很难说了大家知道解决办法就好 转载于:https://www.cnblogs.com/bianyuanzhe/p/5969837.html