eval函数的一点tips

来源:互联网 发布:网络直销项目 编辑:程序博客网 时间:2024/06/05 12:50

eval简介

关于eval这个函数,常见的用法是用来执行含有js代码的字符串,注意这里要传递原始字符串,而不是一个string对象。

eval("1+2")  //  返回3eval("var i = '1+2'") //  var i = 3;

实际程序中极少使用它,常见用法是编写作为递归的js解释器程序,或者编写动态生成并计算js代码的程序。

别名调用和直接调用的区别

eval函数可以通过赋予别名来实现调用,虽然ES3禁止这么做(会抛出一个EvalError异常),但是大多数的实现都允许别名调用的方式。

ES5中进一步规范了Eval的行为,别名调用和直接调用Eval的情况有所不同

直接的eval,当直接使用非限定的eval名称来调用eval()函数时,通常成为直接eval(direct eval),此时,它总是在调用它的上下文作用域内执行。其他的调用如别名调用则始终使用全局对象作为上下文作用域,并且无法读/写/定义局部变量和函数。
——摘自《javascript权威指南》第六版

如下所示

       var geval =  eval;       var x = 100;       function f1() {           var x = 200;           console.log(eval("x + 100"));       }       function f2() {           var x = 200;           console.log(geval("x + 100"));       }       f1();   // 300;       f2();   // 200

f1使用直接的eval(direct eval),在局部上下文作用域执行,f2中的eva是别名调用,所以始终在全局作用域中执行

eval需要注意的问题

由于eval函数需要运行编译器来编译(parse)传递给他的js字符串——这一点,setInterval和setTimeout也是一样的——所以会降低你的执行效率,而有时候使用eval不过是为了执行一条赋值语句而已,所以应该尽量避免使用。

同时,eval也会被用来和XMLHttpRequset(Ajax)配合,来将服务器传递过来的json数据进行编码,然而这里面因为会存在安全问题,所以应该尽量使用JSON.parse这个函数来代替,这个函数遇到有安全问题的JSON数据会抛出一个异常。

原创粉丝点击