」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 揭秘 JavaScript:深入探討提升、臨時死區與可變狀態

揭秘 JavaScript:深入探討提升、臨時死區與可變狀態

發佈於2024-07-30
瀏覽:373

Unraveling JavaScript: A Deep Dive into Hoisting, Temporal Dead Zone, and Variable States

下面我有兩行簡單的程式碼。但我可以向你保證,它要么會讓你很困惑(因為你忽略了 JS 的下劃線原則),要么安慰你。

但是它已經加載瞭如下知識概念

  • 吊掛
  • 暫時死區
  • 變數(未聲明、未初始化、未定義)(獎勵)

我的矛盾聲明
就像 var、const 和 let 也提升它們的屬性,但它們位於不同的區域。

吊掛Def(簡單/外行版)

  1. 我們可以在實際宣告之前存取函數和變數。

現在是時候深入了解Js如何編譯和執行我們的兩行程式碼了

在 JavaScript 中,編譯器和引擎處理變數宣告和賦值的方式可能有細微差別,尤其是在處理 let 和 var 時。
讓我們從編譯器和執行的角度來分解給定程式碼的過程:

name = 'ashu';
let name;

此時我明確表示,當我們寫 javascript 程式碼時,第一個解析器和編譯器會編譯我們的程式碼,然後進入執行階段。

編譯器視角
第一行: name = 'ashu';

編譯階段
JavaScript 引擎解析程式碼並建立必要的範圍。
作業名稱 = 'ashu';

會註明,但在這個階段,引擎不執行程式碼;它僅記錄對名為 name 的變數的賦值的存在。

如果 name 之前沒有聲明過,編譯器會將其視為對全域變數(全域作用域中的 var name)的賦值,因為 var 聲明被提升並可以全域存取。

第二行: 命名;

當編譯器遇到let名稱時;聲明,它承認 name 應該是區塊作用域的。

編譯者將名稱放置在臨時死區 (TDZ) 其所屬範圍,
意味著它承認名稱的存在,但將其標記為未初始化

let 聲明不以與 var. 相同的方式提升

相反,它在作用域中創建一個綁定,並僅在執行聲明時對其進行初始化

執行觀點

第一行: name = 'ashu';

當JavaScript引擎執行賦值name = 'ashu';時,
它檢查目前範圍內名稱是否存在。由於 name 是用 let 聲明的,但位於 TDZ(臨時死區)中, 在初始化 let 聲明之前訪問它的任何嘗試都將導致 ReferenceError。

因此,此時name在TDZ中,賦值name = 'ashu';導致 ReferenceError.


第二行: 命名;

這一行初始化區塊作用域內的name變數。
此後,name 不再位於 TDZ 中,可以毫無錯誤地存取或指派。

現在獎勵小費

未聲明與未定義與未初始化之間的區別;

undeclare :- 變數尚未宣告。
undefined :- 宣告變數但未初始化;
未初始化 :- 變數已定義,但其值將在稍後出現。

Ex:- const result =multiplyBy2(5);
直到函數的返回值將分配給結果,直到那時它將處於未初始化區域。

有趣的事實:-

你知道臨時死區最初是為 Const 裝飾的,但他們在 **Let** 中採用的時間點很晚

參考:-

  1. https://frontendmasters.com/courses/deep-javascript-v3 我與 GitHub co-pilot 的類比
版本聲明 本文轉載於:https://dev.to/ashutoshsarangi/unraveling-javascript-a-deep-dive-into-hoisting-temporal-dead-zone-and-variable-states-4d0j?1如有侵犯,請聯絡study_golang @163.com刪除
最新教學 更多>
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-04-19
  • 使用jQuery如何有效修改":after"偽元素的CSS屬性?
    使用jQuery如何有效修改":after"偽元素的CSS屬性?
    在jquery中了解偽元素的限制:訪問“ selector 嘗試修改“:”選擇器的CSS屬性時,您可能會遇到困難。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    程式設計 發佈於2025-04-19
  • Android如何向PHP服務器發送POST數據?
    Android如何向PHP服務器發送POST數據?
    在android apache httpclient(已棄用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    程式設計 發佈於2025-04-19
  • 解決MySQL錯誤1153:數據包超出'max_allowed_packet'限制
    解決MySQL錯誤1153:數據包超出'max_allowed_packet'限制
    mysql錯誤1153:故障排除比“ max_allowed_pa​​cket” bytes 更大的數據包,用於面對陰謀mysql錯誤1153,同時導入數據capase doft a Database dust?讓我們深入研究罪魁禍首並探索解決方案以糾正此問題。 理解錯誤此錯誤表明在導入過程中...
    程式設計 發佈於2025-04-19
  • 如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    從python import codecs import codecs import codecs 導入 text = codecs.decode('這狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#帶有...
    程式設計 發佈於2025-04-19
  • 如何使用Python理解有效地創建字典?
    如何使用Python理解有效地創建字典?
    python dictionary consection 在python中,詞典綜合提供了一種生成新詞典的簡潔方法。儘管它們與列表綜合相似,但存在一些顯著差異。 與問題所暗示的不同,您無法為鑰匙創建字典理解。您必須明確指定鍵和值。 For example:d = {n: n**2 for n in...
    程式設計 發佈於2025-04-19
  • JavaScript計算兩個日期之間天數的方法
    JavaScript計算兩個日期之間天數的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    程式設計 發佈於2025-04-19
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-04-19
  • 在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    mysql-python安裝錯誤:“ mysql_config找不到”“ 由於缺少MySQL開發庫而出現此錯誤。解決此問題,建議在Ubuntu上使用該分發的存儲庫。使用以下命令安裝Python-MysqldB: sudo apt-get安裝python-mysqldb sudo pip in...
    程式設計 發佈於2025-04-19
  • 編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    錯誤:“ usr/bin/ld:找不到-l “ 此錯誤表明鏈接器在鏈接您的可執行文件時無法找到指定的庫。為了解決此問題,我們將深入研究如何指定庫路徑並將鏈接引導到正確位置的詳細信息。 添加庫搜索路徑的一個可能的原因是,此錯誤是您的makefile中缺少庫搜索路徑。要解決它,您可以在鏈接器命令中添...
    程式設計 發佈於2025-04-19
  • 如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求模擬瀏覽器行為,以及偽造的用戶代理提供了一個用戶 - 代理標頭一個有效方法是提供有效的用戶式header,以提供有效的用戶 - 設置,該標題可以通過browser和Acterner Systems the equestersystermery和操作系統。通過模仿像Chro...
    程式設計 發佈於2025-04-19
  • MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    在兩個條件下插入或更新或更新 solution:的答案在於mysql的插入中...在重複鍵更新語法上。如果不存在匹配行或更新現有行,則此功能強大的功能可以通過插入新行來進行有效的數據操作。如果違反了唯一的密鑰約束。 實現所需的行為,該表必須具有唯一的鍵定義(在這種情況下為'名稱'...
    程式設計 發佈於2025-04-19
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-04-19
  • Python元類工作原理及類創建與定制
    Python元類工作原理及類創建與定制
    python中的metaclasses是什麼? Metaclasses負責在Python中創建類對象。就像類創建實例一樣,元類也創建類。他們提供了對類創建過程的控制層,允許自定義類行為和屬性。 在Python中理解類作為對象的概念,類是描述用於創建新實例或對象的藍圖的對象。這意味著類本身是使用...
    程式設計 發佈於2025-04-19
  • C++中如何將獨占指針作為函數或構造函數參數傳遞?
    C++中如何將獨占指針作為函數或構造函數參數傳遞?
    在構造函數和函數中將唯一的指數管理為參數 unique pointers( unique_ptr [2啟示。通過值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法將唯一指針的所有權轉移到函數/對象。指針的內容被移至功能中,在操作...
    程式設計 發佈於2025-04-19

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3