让变量和块范围

时间:2017-06-19 03:29:34

标签: ecmascript-6 let

为什么第一个控制台日志会在打印出“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);
})();

2 个答案:

答案 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不同的constvar在块语句中创建局部作用域。您没有收到错误,因为新变量 阴影  范围之外的人。