JavaScript:了解范围链

时间:2019-04-11 13:22:32

标签: javascript javascript-scope

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

var name = 'John';

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

foo();

我对此有一些疑问-

  • 为什么函数foo中的记录器即使在变量{ 在全球范围内可用?是否由于相同的变量 在条件伪造块中重新声明,因此全局变量为 从示波器中删除?
  • 如果我们将函数undefined中if语句下的变量声明从foo替换为var,函数let中的logger将从全局范围打印名称。这是怎么工作的?

2 个答案:

答案 0 :(得分:1)

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

let声明的变量具有块范围,因此在未执行if块之前,不会声明变量name

即使您用if(true)进行了更改,它也不起作用,因为该变量仅在块内可用。 {}不在外面。

以下是let的工作示例。

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

答案 1 :(得分:0)

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

var name = 'John';

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

foo();