变量生命周期变量生命周期:声明(作用域注册一个变量)、初始化(分配内存,初始化为undefined)、赋值executed声明和初始化,即变量提升和undefined之所以来自于函数:声明、初始化和赋值都是从头开始完成的,所以函数的变量提升有更高的优先级。let关键字,变量只是先完成声明,并没有去初始化这一步。这时候如果提前访问scope,就会报xxisnotdefined的错误,这就是临时死区的由来。直到解析完带let的那一行才会进入初始化阶段。如果let这一行是赋值操作,那么初始化和赋值是同时进行的const和class和let是一样的。例如,解析以下代码步骤:{//uselessfirstline//uselesssecondlineconsole.log(a)//如果此时访问a,报错aisnotdefinedleta\=1}步骤:发现作用域有leta,先注册a,只注册没用的第一行和没用的第二行a未定义,临时死区的表现假设上一行不报错,a初始化为undefineda并赋值1。相对于var,let和const只是解耦了声明的过程和初始化。var在执行任何语句之前执行。声明和初始化完成,let和const只在任何语句执行前完成声明
