为什么第一个控制台日志会在打印出“Ken”时打印出“James”? let'student'变量不应该是'if-statement'的范围并保留其值为“Ken”吗?此外,不应该出现错误,因为我正在重新声明相同的变量名称'student'?
(function (){
let student = {name: 'James'};
function createStudent(name){
if(true){
let student = {name: name};
}
return student;
}
console.log(createStudent('Ken'));
console.log(student);
})();
答案 0 :(得分:3)
let
是块范围所以这行代码:
let student = {name: name};
仅限于if
语句中的括号。所以,当你以后做
return student;
在if
块之外和定义另一个student
变量的位置之外,该变量不再在范围内,因此范围内唯一的student
变量是{ {1}}一个。
这是一个带注释的版本:
James
不应该让学生'#39;变量是' if-statement'的范围。并保持其价值为"肯"?
它是(function (){
let student = {name: 'James'};
function createStudent(name){
if(true){
// define new student variable that is only in scope
// within this block
let student = {name: name};
}
// here, the student variable on the previous line is no longer
// in scope so referencing it here sees the first declaration
return student;
}
console.log(createStudent('Ken'));
console.log(student);
})();
语句的块作用域。但是,当您执行if
时,它会在该块之外,因此无法再访问return
学生变量,因此唯一的范围是{{1}一个。
此外,如果我重新声明相同的变量名称'学生'
,则不应该出现错误。
定义已在更高范围内定义的变量不是错误。相反,新声明会在该范围内隐藏或隐藏其他声明,暂时覆盖该范围内的声明。
答案 1 :(得分:1)
与let
不同的const
和var
在块语句中创建局部作用域。您没有收到错误,因为新变量
阴影
范围之外的人。