JavaScript 的 eval() 函数详解
语法
/**
* @param {string} expression
* @return {undefined | any}
*/
eval(expression)eval() 函数会将传入的字符串当做 JavaScript 代码进行执行,如果传入的字符串是表达式则返回表达式求值结果,否则返回 undefined 。
描述
如果传入
eval()的参数不是字符串,则会直接返回该参数。非严格模式下直接调用
eval()时,里面使用var声明的变量和使用function声明的函数会修改当前词法作用域,里面使用let和const声明的变量不会修改当前词法作用域,但是会在当前创建新的词法作用域。非严格模式下间接引用
eval()时,会直接运行在全局环境中,里面使用var声明的变量和使用function声明的函数会修改全局词法作用域,里面使用let和const声明的变量不会修改全局词法作用域,但是会在全局环境创建新的词法作用域。严格模式下直接调用的
eval()时,会在当前创建一个新的独立的词法作用域。严格模式下间接引用的
eval()时(只有在eval()内的字符串里面开启严格模式时,字符串才会以严格模式执行),会在全局环境创建一个新的独立的词法作用域。使用
window.eval()等同于间接引用eval()。eval()中执行的代码只能调用 JS 解释器(Interpreter)来解释执行,无法被即时编译器(JIT Compiler)优化,eval()中的执行的代码可能会导致 JS 引擎在已经生成的机器代码中进行变量查找和赋值,带来性能问题。eval()使用不当可能会导致里面执行的字符串容易遭受恶意修改,带来安全问题(比如 XSS 攻击)。使用
eval()会干扰代码压缩工具的行为。代码压缩工具一般会将局部变量名重命名为更短的变量名(如a和b等),以便减小代码体积。当使用了eval()时,由于外部的局部变量可能会被eval()访问到,代码压缩工具便不会对可能会被eval()访问到的局部变量名进行压缩,会降低代码压缩率。
用法
eval() 的基本用法:
CodePen:JavaScript eval() 函数的基本用法
非严格模式下直接调用 eval() :
CodePen: JavaScript 非严格模式下直接调用 eval() 函数
非严格模式下间接引用 eval() :
CodePen: JavaScript 非严格模式下间接引用 eval() 函数
严格模式下直接调用 eval() :
CodePen: JavaScript 严格模式下直接调用 eval() 函数
严格模式下间接引用 eval() :
CodePen: JavaScript 严格模式下间接引用 eval() 函数
使用 window.eval() :
CodePen: JavaScript 使用 window.eval() 函数
使用 eval() 不当引发 XSS 攻击:
参考文献
《你不知道的 JavaScript》
Last updated
Was this helpful?