почему ключевое слово не работает с eval()

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

foo( "var b = 3;", 1 ); 

Это работает отлично, но когда мы используем let вместо var, это не работает. Зачем?

Ответ 1

Потому что eval вводит новый блок кода. Объявление с использованием var объявит переменную за пределами этого блока кода, так как var объявляет переменную в области функций.

let, с другой стороны, объявляет переменную в области блока. Таким образом, ваша переменная b будет видна только в вашем блоке eval. Он не отображается в области вашей функции.

Подробнее о различиях между var и let

EDIT: Чтобы быть более точным eval +, let, фактически, создадим Лексическую среду. См. Ответ @RobG в определении переменной const с помощью eval()