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);
}
输出: 内存 这是第二部分:约翰;
为什么第二个日志中显示了约翰,而国王已经被改成公羊?
答案 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
关键字得到的结果相同,因为您正在为那些由函数包装的变量创建新的作用域。