0

以下代码片段中的范围链是什么 -

var name = 'John';

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

foo();

我对此有几个疑问 -

  • 为什么即使变量在全局范围内可用,函数中的记录器仍在foo打印?undefined是因为在条件 falsy 块中重新声明了相同的变量,因此全局变量被从范围中删除了吗?
  • 此外,如果我们将函数内部 if 语句下的变量声明替换为footo varlet则函数内部的记录器会foo从全局范围打印名称。这是如何工作的?
4

2 回答 2

1

是的,这是因为使用声明的变量var具有函数范围,并且它们被提升到function. 它记录undefined由于吊装。

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

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

这是如何let工作的示例。

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

于 2019-04-11T13:26:14.960 回答
0

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

var name = 'John';

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

foo();
于 2019-04-11T13:25:58.447 回答