为什么让关键字不能与eval()一起使用

Ken*_*ega 17 javascript

function foo(str, a) {
  eval( str );
  console.log( a, b );
}

foo( "var b = 3;", 1 ); 
Run Code Online (Sandbox Code Playgroud)

这很好用,但是当我们使用let而不是var时,它不起作用.为什么?

Gui*_*ges 21

因为eval引入了一个新的代码块.声明using var将在此代码块之外声明一个变量,因为var在函数作用域中声明了一个变量.

let另一方面,在块范围内声明一个变量.因此,您的b变量只会在您的eval块中可见.它在您的函数范围内不可见.

更多关于var和let之间的区别

编辑:更确切地说eval+ let做,事实上,创建一个词汇环境.使用eval()查看定义const变量中的 @RobG响应

  • 值得一提的是,eval中的上下文比几行解释稍微复杂一些.官方ECMAScript文档解释了PerformEval操作如何根据外部环境实际工作:https://www.ecma-international.org/ecma-262/6.0/#sec-eval-x(18.2.1和18.2.1.1) .不是很相关,但在我看来,值得一看. (3认同)