1.一、JSHoisting的提升观察变量自举的代码:today="Friday";console.log(today);//Fridayvartoday="Monday!";declare步骤虽然在最后,但是今天已经打印成功了,因为declare被吊到了最上面。vartoday;//hoisteddeclarationtoday="Friday";//theoriginalline1console.log(today);//Hello!today="Monday";//`var`isgone!JSEngine提前将var置顶执行,并初始化值未定义。然后查看函数bootstrap:today();//Friday!functiontoday(){console.log("Friday");}同样的原理是在complie这一步,所有函数都提前解析成AST,所以是All提升到顶部。继续检查函数和变量的组合。today="Friday";printToday();//TodayisFriday.functionprintToday(){console.log(`Todayis${today}!`);}vartoday;实际的执行是先解除函数,再解除var。functionprintToday(){console.log(`Todayis${today}!`);}vartoday;today="Friday";printToday();//TodayisFriday.其次,重复声明问题以检查以下代码:letkeepMoving=true;while(keepMoving){letvalue=Math.random();if(value>0.5){keepMoving=false;}}乍一看,好像每次循环都会执行`letvalue=Math.random();`,但实际上上面只执行了一次。执行一次后,declare部分将从代码中移除。3.变量初始化的问题TDZ问题除了var,let也会引发,但是不会初始化:varstudentName="Timy";{console.log(studentName);//???letstudentName="Smith";console.log(studentName);//Smith}第一个console不会输出"Timy"但是会报错,说明let也被引发了,只是没有初始化。这个问题的解决方法就是把let,const等都写到最上面。
