当前位置: 首页 > 编程笔记 >

JavaScript中的eval()函数使用介绍

蓬野
2023-03-14
本文向大家介绍JavaScript中的eval()函数使用介绍,包括了JavaScript中的eval()函数使用介绍的使用技巧和注意事项,需要的朋友参考一下

在JavaScript中,可以使用eval()函数来解析字符串中的JavaScript代码,并返回相应的代码执行结果:



console.log(eval("42 * 2"));//84


就本质而言,eval()是JavaScript全局对象的一个函数。比如,上述代码等价于:



console.log(this.eval("42 * 2"));//84


不过在使用eval()语句时,一般都采用上述第一种做法,也即忽略全局对象直接使用eval()。

eval()的使用

基于以下两个原因,除非确实需要,不然应尽量避免在代码中使用eval()语句:

1.从逻辑上来说,字符串应该用于储存程序运行过程中的内容、信息,而不应该用于储存具体的计算逻辑。
2.由于eval()参数为字符串,而对于一段字符串无法词法进行,因此对于eval()调用语句,JavaScript解释器无法进行优化。

eval()的返回值

eval()的返回值遵循以下规则:

1.如果eval()的参数不是字符串,那么eval()将直接返回参数。
2.如果eval()的参数是字符串,那么eval()将这个字符串解析成代码后进行执行,并返回最后一行代码执行的结果。
3.如果字符串无法解析成合法的代码,eval()将抛出SyntaxError错误。
4.如果字符串能够被解析成合法的代码,但是在执行这一代码过程中报错,那么这个错误会上报给eval()语句,并由eval()抛出。


console.log(eval([1,2,3]));//[1, 2, 3]

console.log(typeof eval([1,2,3]));//object

console.log(eval("42 */ 2"));//SyntaxError console.log(eval("42 * 2; 22 * 3;"));//66. eval returns the result of last expression/statement console.log(eval("null.toString()"));//TypeError, exception in eval-ed code will be propagated outside eval().

变量环境(variable environment)

JavaScript中eval()有一个重要的特性:eval()参数字符串中的代码可以访问外部代码中的变量,同时也可以将参数字符串代码中新建的变量暴露给外部代码。也即,如果eval()参数字符串可以被合法解析,那么JS会将解析后的代码替换掉eval()所在的那一行:


//variable environment

var a = 108;

console.log(eval("function double(x){return x*2;} a = double(a)"));

console.log(a);//216

console.log(double(33));//66


值得注意的是,实现上述特性的前提是eval()参数字符串中的代码可以被合法解析。除了代码语法正确外,JS还要求eval()参数字符串中的代码必须“自成一体”:仅就参数字符串中的代码而言,代码必须是有意义的。比如,无法将诸如“return;”这样的字符串传给eval()函数:



function test(){

  var s = "test";

  eval("return s;");

}

test();//SyntaxError: return not in function


如果直接使用eval()函数,那么eval()参数字符串中的代码所访问的变量是eval()语句所在function的那些变量,也即eval()函数所使用的变量环境是“本地变量环境”。如果不直接使用eval()函数,而是使用一个同样指向eval()函数的新变量,那么相应参数字符串中的代码所访问的变量均为全局变量,也即eval()函数所使用的变量环境是“全局变量环境”:



//local variable environment and global variable environment

var renamed = eval;

var x = "origin", y = "origin";

function f(){

  var x = "new";

  eval("x += 'Changed';");

  return x;

}

function g(){

  var y = "new";

  renamed("y += 'Changed';");

  return y;

}

console.log(f(), x);//newChanged origin

console.log(g(), y);//new originChanged


不过,值得注意的是,IE6、7、8中的行为与此不同。在IE6、7、8中,即使eval()函数被重命名,所使用的也依然是“本地变量环境”。

 类似资料:
  • 本文向大家介绍JavaScript中的console.trace()函数介绍,包括了JavaScript中的console.trace()函数介绍的使用技巧和注意事项,需要的朋友参考一下 调试JavaScript程序时,有时需要打印函数调用的栈信息,这可以通过使用console.trace()来实现。以下面的代码为例: 在doSubTask()函数的执行结尾处插入了一行console.trace(

  • 本文向大家介绍JavaScript中的console.dir()函数介绍,包括了JavaScript中的console.dir()函数介绍的使用技巧和注意事项,需要的朋友参考一下 在调试JavaScript程序时,有时需要dump某些对象的详细信息。通过手工编写JavaScript代码可以完成这一工作:针对对象的属性进行循环,将循环到的每一个属性值打印出来;可见,这一过程是比较繁琐的。在具备调试工

  • 本文向大家介绍JavaScript中的console.assert()函数介绍,包括了JavaScript中的console.assert()函数介绍的使用技巧和注意事项,需要的朋友参考一下 在JavaScript程序的开发和维护过程中,Assert(断言)是一个很好的用于保证程序正确性的特性。在具备调试工具的浏览器上,这一特性可以通过调用console.assert()来实现。比如在以下代码中,

  • 本文向大家介绍Eval函数的作用相关面试题,主要包含被问及Eval函数的作用时的应答技巧和注意事项,需要的朋友参考一下 eval可以将字符串生成语句执行,一般执行动态的js语句。 eval的使用场合:有时候我们预先不知道要执行什么语句,只有当条件和参数给时才知道执行什么语句,这时候eval就派上用场了。

  • eval函数与文本变量一起实现有力的文本宏工具。语句 eval(s) 用MATLAB的注释器求表达式的值或执行包含于文本字符串s的语句。 前一节的例子也可以在下面的代码中实现,虽然这有点低效率因为它用到完全注释器,而不只是函数调用。 for d = 1:31 s = ['load August' int2str(d) '.dat']; eval(s) % Process t

  • 本文向大家介绍Javascript中的高阶函数介绍,包括了Javascript中的高阶函数介绍的使用技巧和注意事项,需要的朋友参考一下 这是一个有趣的东西,这或许也在说明Javascript对象的强大。我们要做的就是在上一篇说到的那样,输出一个Hello,World,而输入的东西是print('Hello')('World'),而这就是所谓的高阶函数。 高阶函数 高阶看上去就像是一种先进的编程技术

  • 本文向大家介绍JavaScript中的console.log()函数详细介绍,包括了JavaScript中的console.log()函数详细介绍的使用技巧和注意事项,需要的朋友参考一下 对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会阻断JavaScript程序的执行,从而造成副作用;而console.log

  • 本文向大家介绍JavaScript中的console.time()函数详细介绍,包括了JavaScript中的console.time()函数详细介绍的使用技巧和注意事项,需要的朋友参考一下 如果需要在Web调试过程中知道代码执行的时间,那么可以通过在JavaScript代码中添加console.time()语句和console.timeEnd()语句来对程序的执行进行计时。以下面这个耗时较长的f