词法环境/编译在这里如何工作

How does lexical environment / compilation works here

当我使用 'var' 时,下面的函数 returns 未定义。

var x = 3;

function func(randomize) {
  if (randomize) {
    var x = Math.random();
    return x;
  }
  return x;
}
console.log(func(false)); // undefined

当我使用'let'时,同样的功能returns 3.

let x = 3;

function func(randomize) {
  if (randomize) {
    let x = Math.random();
    return x;
  }
  return x;
}
console.log(func(false)); //3

这里的编译是如何工作的?这是因为词法环境吗?我对结果感到惊讶。请解释。

let 是块范围,这意味着如果您在全局范围内声明 let x = 3,它将定义所有通过全局范围以下的范围。这就是为什么当你调用 func(false) 因为 x 在全局范围内,它仍然被定义为 3。

var 是执行上下文范围。因此,当您 运行 函数 func(false) 时,它在函数 运行 时没有 x 的上下文,因为函数中没有定义 x。