这篇文章主要是要来探讨 Let 有没有 Hoisting?
之前提过,提升(hoisting)简单来说分为创造以及执行的两个阶段~
如果对于提升(hoisting)这个观念还是没有很清楚的概念的话,可以参考这篇文章。
那么 let 有没有类似这样的状态呢?
console.log(odin);let odin = 'husky';
好,首先这样状况回给我们的是错误的讯息,并且告诉我们在还没有宣告之前,没有办法针对这个变数进行调用。
那我们在修改一下程式码改变情境:
console.log(odin);let odin = 'husky';{ console.log(odin); // 如果没有提升的话,照理说应该可以取得外层的结果)(husky) let odin = 'dog';}
这边呢,如同注解里面说的,如果有提升的话,可能就会出现不同的状态。那我们来看看有甚么结果~
他一样跳出一个错误,没有办法在初始化之前取得 odin 这个变数。
{ // 创造 let odin; // 暂时性死区 TDZ // 执行 console.log(odin); let odin = 'dog';}
其实实际上的状况是这样,let也有类似提升的概念,但提升完之后,会有一个暂时性死区的阶段,跟一般的提升不同,一般的提升会先给予变数 undefined 的状态。
如果在暂时性死区的时候针对变数进行调用,就会报错。
稍微总结一下刚刚的观念~
1. let 一样会有创造阶段
2. 但从创造到实际宣告的阶段会出现 TDZ,这个区域无法呼叫变数
3. 有创造到执行的概念,但不会预先出现 undefined 而是出现错误讯息提示
4. 文件不会表明这与 var 的 Hoisting 相同
再来看看一些程式码~
console.log(typeof a);console.log(typeof myName);let myName = '';
当我们利用 typeof 针对 not define 的变数进行检查的时候,会出现 undefined
但针对 let 宣告的变数还是依然会报错,也就是说还是在暂时性死区中调用该变数,所以系统进行报错!
以上就是针对 Let 有没有 Hoisting? 以及暂时性死区介绍,没有问题的话就继续往下吧!