• var/function语法上允许相同上下文中“重复去声明一个变量”,只不过浏览器渲染的时候,不会去重复声明;
  • 但let/const/class,从语法上就不支持重复声明「报SyntaxError」,而且所谓的不允许重复声明,是不论当前上下文中,我们基于何种方式,是要声明过这个变量,那么绝对不允许再拿let/const/class声明了;

    • 检测是否重复声明的事情,不是发生在代码执行阶段,而是在“词法分析阶段”,
    • 如果有重复声明的语法错误,则AST都不会生成{词法解析不通过},JS中所有代码也都不会在执行了!!

      词法分析:

  • @1 我们从服务器端获取的到JS代码,本质是一堆字符串,而浏览器会把这堆字符串,按照ECMA262规范,解析为自己可以识别的JS代码…我们把这个过程,称之为“词法分析/解析”

  • @2 词法分析阶段,会把这堆代码变为浏览器可以识别的“树形结构 -> AST语法树”
  1. // Uncaught SyntaxError: Identifier 'a' has already been declared //语法错误
  2. //因为在代码执行前 要进行语法分析 然后检测到 a=>形参变量 let a 创建变量 所以报错
  3. console.log('OK');
  4. function sum(a) {
  5. console.log(a);
  6. let a = 100;
  7. console.log(a);
  8. }
  9. sum(200);