# eval

我们之前讲过 js 中的作用域采用的是词法作用域(在语言编译词法分析阶段)就会确定的。但这是不准备的,有一些方法可以骗过词法作用域。

# eval 参数

  1. eval 的参数是一个字符串,这个字符串可以是表达式(有返回值),或者是一个语句或多个语句。
  2. 如果参数不是一个字符串,就会原封不断的返回。

# eval 恶魔

  1. eval 的权限和调用者的权限是一样的,也就是说,一旦有人恶意的修改了 eval 的字符串,那么就可能注入 XSS 攻击,对用户的浏览器带来危害。

  2. eval 在执行的时候才会调用 js 去解析器字符串, js 解析去将 js 转为机器代码。如果存在创建变量或者是修改了变量,eval 会强制浏览器去查找,更改变量会强制浏览器重新执行所有已经生产的机器代码。

  3. 对于 js 执行器来说,在编译的时候进行静态分析,会做很多的优化,很大一部分就是来自于在静态的分析代码,提前知道函数和变量声明在何处,但是一旦存在 eval,引擎也不会知道你到底会怎么做,这时候引擎不得不假设自己所标识的都是无效的,也就不会做优化。

# 用法

var a = 2;
function foo(str) {
    eval(str);
    console.log(a);  // 1
}
foo('var a = 1;')