5.7.1.2 eval() 方法

  现在我们介绍最后一个方法,这大概是ECMAScript语言中最强大的一个方法:eval()。eval()方法就想一个完整的ECMAScript解析器,它只接受一个参数,即要执行的ECMAScript(或JavaScript)字符串。例如:

eval("alert('hi')");

  这行代码作用等价于下面这行代码:

alert('hi');

  当解析器发现代码中滴啊用eval()方法时,它会将传入的参数当作实际的ECMAScript语句来解析,然后把执行结果插入到原位置。通过eval()执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。这意味着通过eval()执行的代码可以引用在包含环境中定义的变量,例如:

var msg="hello world";
eval("alert(msg)"); //hello world

  可见,变量msg是在eval()调用的环境之外定义的,但其中调用的alert()仍然能够显示“hello world”。这是因为上面第二行代码最终被替换成了一行真正的代码。同样的,我们也可以在eval()调用中定义一个函数,然后再在该调用的外部代码中引用这个函数:

eval("function sayHi(){alert('hi');}");
sayHi();

  显然,函数sayHi()是在eval()内部定义的。但由于对eval()的调用最终会被替换成定义函数的实际代码,因此可以在下一行调用sayHi()。对于变量也一样:

eval("var msg='hello world'; ");
alert(msg);//hello world

  在eval()中创建的任何变量或函数都不会被提升,因为在解析代码的时候,它们被包含在一个字符中;它们只在eval()执行的时候创建。

  严格模式下,在外部访问不到eval()中创建的任何变量或函数,因此前面两个例子都会导致错误。同样,在严格模式下,为eval()赋值也会导致错误:

"use strict";
eval="hi";//causes error

  注:能够解释代码字符串的能力非常强大,但非常危险。因此在使用eval()时必须极为谨慎,特别是在用它执行用户输入数据的情况下。否则,可能会有恶意用户输入威胁你的站点或应用程序安全的代码(即所谓的代码注入)。

原文地址:https://www.cnblogs.com/yxlove/p/4542620.html