[譯]JavaScript️可視化:變量提高

本系列包括6篇文章javascript

提高是每一個JS開發人員都據說過的那些術語之一,由於您在Google上搜索了使人討厭的錯誤並最終到達StackOverflow,此人告訴您此錯誤是因爲提高引發的。🙃那麼,提高是什麼?(僅供參考- 範圍將在另外一篇文章中介紹,我但願使文章小而集中)java

若是您不熟悉JavaScript,則可能會遇到「怪異」的行爲,其中某些變量是隨機的undefined,ReferenceErrors會被拋出,依此類推。提高一般被解釋爲將變量和函數放在文件的頂部,可是,那不是事實,雖然行爲看起來像這樣git

當JS引擎獲取咱們的腳本時,它要作的第一件事就是爲代碼中的數據設置內存。在這一點上,沒有代碼被執行,只是準備好全部要執行的東西。函數聲明和變量的存儲方式不一樣。函數以對整個函數的引用存儲。github

對於變量,則有所不一樣。ES6引入了兩個新的關鍵字來聲明變量:let和const。用letor const關鍵字聲明的變量未初始化存儲。函數

使用var關鍵字聲明的變量以默認值存儲undefined。oop

如今建立階段已經完成,咱們能夠實際執行代碼了。讓咱們看看若是在聲明函數或任何變量以前在文件頂部有3個console.log語句,會發生什麼狀況。3d

因爲函數是在引用整個函數代碼的狀況下存儲的,所以咱們甚至能夠在建立它們的行以前調用它們!🔥code

當咱們引用與聲明的變量var的聲明以前的關鍵字,它會簡單地返回它存儲與它的默認值:undefined!可是,這有時可能會致使「意外」行爲。在大多數狀況下,這意味着您無心中引用了它(您可能不但願它實際上具備的值undefined)😬cdn

爲了防止undefined像使用var關鍵字那樣意外地引用變量,ReferenceError每當咱們嘗試訪問未初始化的變量時,都將引起a 。在它們實際聲明以前的「區域」稱爲時間盲區:在初始化以前,您不能引用變量(也包括ES6類!)。blog

當引擎經過咱們實際聲明變量的行時,內存中的值將被咱們實際聲明它們的值覆蓋。

(糟糕,我如今注意到這應該是數字7。將盡快更新)。

全作完了!🎉快速回顧:

在執行代碼以前,將函數和變量存儲在內存中以用於執行上下文。這稱爲吊裝。 函數存儲與將整個函數的參考,與變量var與值的關鍵字undefined,和變量與let和const關鍵字地存儲未初始化。 我但願提高術語一詞的含義再也不那麼模糊,由於咱們已經研究了執行代碼時發生的狀況。與往常同樣,不要擔憂它是否仍然沒有任何意義。您使用它的次數越多,您將對其感到更加自在。隨時向我尋求幫助,我很樂意爲您服務!😃

我的博客

github.com/abc-club/fr…

相關文章
相關標籤/搜索