javascript中eval的用法

javascript中eval的用法

专业回答
ikasa007    php工程师  益云创新中心程序员
2015-07-01 09:50

1. 和其他解释性语言一样,javascript 同样可以解释运行由javascript源代码组成的字符串,javascript 通过eval()来完成。

2. eval() 其实是一个函数,是javascript很早版本中就已经存在,但是javascript设计者和解释器对其进行了许多的限制,看起来eval更像一个运算符。但是作为用于动态执行代码,eval存在这样的问题,解释器无法对动态代码做进一步的优化。如果将它看做一个函数,那它是可以被赋予其他名字的:

 var A = eval;

 var B = A;

如果是这样的话,那么解释器就无法优化调用B()的函数了。因此设计者赋予eval一些运算符的特性(作为保留字)之后这些问题得到解决。当然它还有更多的限制,留待读者慢慢体会。

 

3. Eval 只有一个参数,如果传入的不是字符串的话,它直接返回这个参数;如果是字符串,那么首先会进行编译,如编译失败则爆出语法错误;编译成功则执行代码。更主要的是eval可以使用调用它的变量作用域环境,也就是说它查找的变量或者新增的变量作用域跟代码的完全一样。

如:

function A()

{

  eval('var x ;');

  eval("x=1");   //在一个函数中定义或者更改,那就是针对局部变量。

}

 

4. 全局eval

         eval 可以动态执行代码,并申明或者改变变量,当然可以对全局变量进行上述操作。如

var globalEval = eval;     //定义全局eval函数别名
var a ='global', b = 'global';    //全局变量
function c()
{
  var a = 'local';      //局部变量
eval('a+="changed"');  //直接更改局部变量的值
 return a;      //返回更改后的局部变量
}
 function d()
{
   var b = 'local';
   globalEval("b+='changed'");
   return b;
} 
   
console.log(c(), a);            //localchanged                       global
console.log(d() , b)           //local                                         globalchanged

更强的是,全局的eval还可以更改局部变量的能力,不过这也是javascript优化的一个大问题。 当然在严格模式下,eval更像一个运算符,不可以用别名来覆盖eval。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值