JavaScript: 理解作用域链

JavaScript: understanding scope chain

以下代码片段中的作用域链是什么 -

var name = 'John';

function foo() {
  if (false) {
    var name = 'James';
  }
  console.log(name);
}

foo();

我有几个关于这个的问题 -

如果你用var重新声明变量,它在整个函数中都有作用域。如果您使用 let 而不是 var,它将仅在 if 范围内可用。

var name = 'John';

function foo() {
  if (false) {
    let name = 'James';
  }
  console.log(name);
}

foo();

是的,这是因为用 var 声明的变量具有函数作用域,并且它们被提升到 function 的顶部。由于提升,它记录 undefined

let 声明的变量具有块作用域,因此在不执行 if 块之前,不会声明变量 name

即使您用 if(true) 更改它也不会起作用,因为该变量只能在块内使用。 {}不在外面。

这是 let 工作原理的示例。

if(true){
  let x = 3
}
console.log(x);