出处

函数 - JavaScript 教程 - 网道 —— eval-的别名调用

代码

  1. var a = 1;
  2. function f() {
  3. var a = 2;
  4. var e = eval;
  5. e('console.log(a)');
  6. }
  7. f() // 1

上面代码中,eval是别名调用,所以即使它是在函数中,它的作用域还是全局作用域,因此输出的a为全局变量。这样的话,引擎就能确认e()不会对当前的函数作用域产生影响,优化的时候就可以把这一行排除掉。

  • eval的别名调用的形式五花八门,只要不是直接调用,都属于别名调用,因为引擎只能分辨eval()这一种形式是直接调用。 ``` eval.call(null, ‘…’) window.eval(‘…’) (1, eval)(‘…’) (eval, eval)(‘…’)

```

上面这些形式都是eval的别名调用,作用域都是全局作用域。