Java范围,使用let

时间:2018-07-15 07:26:46

标签: javascript if-statement

let king = 'John';

if(true) {
    let king = 'Sam';

    if(true) {
        let king = 'Ram';
        console.log(king);
        }
    }

if(true){
    console.log("This is second part:"+ king);
    }

输出: 内存 这是第二部分:约翰;

为什么第二个日志中显示了约翰,而国王已经被改成公羊?

4 个答案:

答案 0 :(得分:1)

这是因为您在if中多次使用let。如果您一开始只声明一次“国王”,这将起作用。

let king = 'John';

if (true) {
  king = 'Sam';

  if (true) {
    king = 'Ram';
  }
} 

console.log("This is second part:" + king);

答案 1 :(得分:0)

这是因为 let 声明的变量在块中具有范围。从外观和所需输出来看,您可能希望使用 var 而不是 let ,即

var king = 'John';
if(true) {
  var king = 'Sam';
  if(true) {
    var king = 'Ram';
    console.log(king);
  }
}
if(true){
  console.log("This is second part:"+ king);
}

答案 2 :(得分:0)

因为let具有块级范围。该变量只能在其自己的块(花括号内的代码)内访问。内部king变量使外部king变量蒙上阴影。不必在每个块中声明变量,而应该在顶部仅声明一次。

let king = 'John';

if(true) {
    king = 'Sam';

    if(true) {
        king = 'Ram';
        console.log(king);
        }
    }

if(true){
    console.log("This is second part:"+ king);
}

答案 3 :(得分:0)

正如前面的答案中提到的那样,使用let声明的变量是块范围的,这就是为什么要得到该结果的原因。

只需提一下,const也是如此。为了了解差异,请考虑使用var关键字声明的变量,这些变量是函数范围的,因此,如果您执行类似的操作

var king = 'John';

if (true) {
  var king = 'Sam';

  if (true) {
    var king = 'Ram';
    console.log(king);
  }
}

if (true) { console.log("This is second part:"+ king); }

两次都得到Ram是因为最后一个赋值会覆盖前两个(它们都在同一作用域中),但是如果将其包装在函数中

var king = 'John';

function foo() {
  if (true) {
    var king = 'Sam';

    if (true) {
      var king = 'Ram';
      console.log(king);
    }
  }
}

foo();

if (true) { console.log("This is second part:"+ king); }

let关键字得到的结果相同,因为您正在为那些由函数包装的变量创建新的作用域。