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

时间:2019-11-06 02:01:03

标签: javascript let

当我使用'var'时,下面的函数返回undefined。

var x = 3;

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

当我使用'let'时,相同的函数返回3。

let x = 3;

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

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

1 个答案:

答案 0 :(得分:0)

let是一个块作用域,这意味着如果在全局作用域中声明let x = 3,则将通过该作用域下的所有作用域进行定义。这就是为什么在调用func(false)时,因为x在全局范围内,但仍定义为3的原因。

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