」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > JavaScript 提升解釋以提升您的編碼技能

JavaScript 提升解釋以提升您的編碼技能

發佈於2024-11-03
瀏覽:367

JavaScript Hoisting Explained to Improve Your Coding Skills

JavaScript 是一種經常會讓新手感到困惑的語言。其中一種行為是提升,每個 JavaScript 開發人員都應該理解這個概念,以便編寫更可預測的程式碼。在本文中,我們將探討什麼是提升、它如何與變數和函數配合使用,以及如何避免與之相關的陷阱。

什麼是提升?

提升是指 JavaScript 將宣告(但不是初始化)移到其作用域頂部的預設行為。這發生在程式碼執行之前的編譯階段。這意味著您可以在程式碼中實際聲明變數和函數之前使用它們。

例子:

console.log(myVar); // undefined
var myVar = 5;

在此範例中,您可能會遇到 ReferenceError,因為 myVar 在聲明之前就被使用了。然而,由於提升,實際發生的情況是聲明 var myVar 被移動到其作用域的頂部,而賦值 (myVar = 5) 仍然保留在原位。在內部,JavaScript 將其解釋為:

var myVar;
console.log(myVar); // undefined
myVar = 5;

因此,console.log運行時myVar已定義但尚未賦值,這就是為什麼它輸出undefined。

提升與變數

讓我們分解一下提升如何處理不同類型的變數:var、let 和 const。

1. var 提升

對於 var,宣告和變數都會被提升。但是,僅移動了聲明,而不移動了賦值。

console.log(a); // undefined
var a = 10;

聲明 var a 被提升,但賦值稍後發生,因此 a 在記錄時未定義。

2. let 和 const 提升

用let和const宣告的變數也會被提升,但它們不會像var一樣被初始化為未定義。相反,它們從作用域開始處進入臨時死區 (TDZ),直到遇到聲明為止。

console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 20;

此處,b 被提升,但在執行實際聲明行之前它不可用,導致引用錯誤。

同樣的行為適用於 const,但附加規則是 const 變數必須在宣告時初始化。

起重與功能

函數宣告被完全提升,這表示函數名稱和函數體都被移到作用域的頂端。這允許您在聲明函數之前調用函數。

函數宣告範例:

greet(); // "Hello, World!"

function greet() {
  console.log("Hello, World!");
}

這裡,函數宣告greet被完全提升,因此即使在程式碼到達其定義之前也可以呼叫該函數。

函數表達式與提升

但是,函數表達式的提升方式不同。由於它們被視為賦值,因此僅提升變數聲明,而不提升函數定義。

greet(); // TypeError: greet is not a function

var greet = function() {
  console.log("Hello, World!");
};

在這種情況下,變數greet被提升了,但是在提升過程中它被賦值為undefined。這就是為什麼在賦值之前呼叫greet()會拋出TypeError。

避免吊掛陷阱

為避免提升造成混亂,請遵循以下最佳實務:

  1. 在其作用域的頂部聲明變數 – 儘管提升將聲明移動到頂部,但在各自作用域的開頭聲明它們是一個很好的做法。這使您的程式碼更具可讀性和可預測性。

  2. 使用 let 和 const 而不是 var – 用 let 和 const 宣告的變數是區塊作用域的,這使得提升行為更清晰且更不容易出現錯誤。它還減少了在初始化之前意外引用變數的可能性。

  3. 組織函數宣告 – 在使用函數之前宣告它們以避免依賴提升行為。

結論

提升是 JavaScript 的眾多怪癖之一,但了解它的工作原理可以幫助您編寫更清晰且不易出錯的程式碼。請記住,雖然函數宣告和變數都被提升,但它們的行為不同。堅持使用 let 和 const 而不是 var,並保持程式碼組織良好以避免意外。

透過注意提升,您可以讓 JavaScript 程式碼更可預測且更易於維護。

版本聲明 本文轉載於:https://dev.to/byte-sized-news/javascript-hoisting-explained-to-improve-your-coding-skills-37b2?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在 Laravel 中將花式文本標準化為普通文本
    在 Laravel 中將花式文本標準化為普通文本
    文章源自https://medium.com/@hafiqiqmal93/normalizing-fancy-text-to-normal-text-in-laravel-7d9ed56d5a78 使用者輸入的文字一點也不有趣。隨著 Unicode 在智慧型手機中的出現,用戶現在可以奢侈地(有時甚...
    程式設計 發佈於2024-11-08
  • 4 種頂級 API 測試工具指南
    4 種頂級 API 測試工具指南
    在 API 测试方面,拥有正确的工具可以带来巨大的改变。在本文中,我们将探讨 2024 年可用的一些最佳 API 测试工具,适合各个级别的开发人员。 回声API EchoAPI 是一种新兴且快速发展的 API 开发协作工具。与 Postman 不同,它有几个明显的优势,使其成为 P...
    程式設計 發佈於2024-11-08
  • 如何解決多項目 Gradle 配置中的測試依賴?
    如何解決多項目 Gradle 配置中的測試依賴?
    解決多項目Gradle 配置中的測試依賴關係在Gradle 中處理多項目建置時,必須在跨專案的測試程式碼之間建立有效的依賴關係。考慮專案 A 和專案 B 存在的場景,專案 B 依賴專案 A 的元件。 問題陳述在這種情況下,項目 B 的 build.gradle 可能如下所示:apply plugin...
    程式設計 發佈於2024-11-08
  • 如何在 Rust 中合理地組織你的 Tauri 命令
    如何在 Rust 中合理地組織你的 Tauri 命令
    在建立 Tauri 應用程式時,保持程式碼庫井然有序非常重要,尤其是隨著專案的成長。相信我,作為一個對 Rust 比較陌生的人,我也遇到過不少混亂的情況——花幾個小時把自己從自己挖的坑裡挖出來。如果你跟我一樣,你就會想避免這種情況。那麼,讓我們討論一下如何透過將 Tauri 命令拆分為單獨的檔案來保...
    程式設計 發佈於2024-11-08
  • ## 如何在 Docker 映像中預先快取 Go 依賴項以加快建置速度?
    ## 如何在 Docker 映像中預先快取 Go 依賴項以加快建置速度?
    利用預先快取的依賴關係高效建置 Docker 映像建置 Docker 映像時,最大限度地減少建置時間至關重要。一種策略是快取相依性。然而,這需要先建立依賴項,這可能會很耗時。 有沒有辦法預先建立 go.mod 檔案中列出的多個依賴項? 答案在於利用 Docker 的快取機制。建議的 Dockerfi...
    程式設計 發佈於2024-11-08
  • 如何刪除重複行同時保留最舊的提交?
    如何刪除重複行同時保留最舊的提交?
    管理重複行:保留最舊的提交重複資料會顯著影響任何資料庫的完整性和可用性。在這種情況下,我們的目標是根據subscriberEmail欄位消除重複行,只保留原始提交。 為了在不訴諸表交換技術的情況下實現這一點,我們可以使用以下SQL查詢: delete x from myTable x join m...
    程式設計 發佈於2024-11-08
  • 如何處理MySQL表名中的特殊字元?
    如何處理MySQL表名中的特殊字元?
    處理MySQL表名中的特殊字符MySQL將某些字符保留為特殊字符,這些字符在不經意使用時可能會與表名發生衝突。在給定的場景中,表名「e!」中的感嘆號 (!)資料插入時發生錯誤。 為了解決這個問題,MySQL 允許在使用特殊字元時用反引號 (`) 將表名括起來。這有效地“轉義”了特殊字符,並允許將其識...
    程式設計 發佈於2024-11-08
  • 了解 JVM 鎖優化
    了解 JVM 鎖優化
    并发对于开发可以执行多个并发操作的健壮、可扩展的应用程序非常关键。然而,为此需要付出同步方面的代价。由于获取和释放锁的随之而来的开销,它会产生性能成本。为了减轻这些性能成本,JVM 中融入了多种优化,例如偏向锁定、锁定消除、锁定粗化以及轻量级和重量级锁定的概念。 在本文中,我们将更详细地了解这些优化...
    程式設計 發佈於2024-11-08
  • 測試驅動開發 (TDD):嚴格的軟體開發方法
    測試驅動開發 (TDD):嚴格的軟體開發方法
    定義 TDD 測試驅動開發(TDD)是一種軟體開發方法,強調在編寫生產程式碼之前編寫測試。這是一種嚴格的方法,透過測試推動開發,有助於確保高品質的程式碼。 理解 TDD TDD 是一個循環過程,涉及三個關鍵步驟: 紅色:編寫定義程式碼所需行為的失敗測試。此步驟有助於澄清需求並確保測試集中於期望...
    程式設計 發佈於2024-11-08
  • 介面
    介面
    在物件導向程式設計中,定義類別應該做什麼是有用的,但定義類別應該做什麼是有用的。 抽象方法定義了方法的簽章而不提供實現,子類別必須實作該方法。 Java 中的介面可讓您將應該做什麼的定義與如何做的實作完全分開。 介面可以指定沒有主體的方法,該方法必須由類別實作。 實作一個介面的類別的數量沒...
    程式設計 發佈於2024-11-08
  • 在GoClipse中調試Go程式時如何避免進入彙編程式碼?
    在GoClipse中調試Go程式時如何避免進入彙編程式碼?
    使用彙編程式碼在GoClipse 中偵錯Go 程式嘗試在GoClipse 中除錯Go 程式時,使用者可能會遇到偵錯器無法正常運行的問題單步執行彙編程式碼而不是Go 程式碼。儘管正確安裝了 gdb 進行調試,但還是會發生這種情況。 設定斷點並透過 Eclipse 偵錯器執行程式時,它會輸入「rt0_d...
    程式設計 發佈於2024-11-08
  • 在 JavaScript 產生數字範圍
    在 JavaScript 產生數字範圍
    產生一個整數數組,並用從起始數字開始到結束數字結束的連續值填入該數組。 解決方案 function range(start, end) { const rangeArray = Array.from( {length: Math.ceil(end - start 1...
    程式設計 發佈於2024-11-08
  • 為什麼我的 PHP Curl 腳本中會出現「CURL 錯誤:接收失敗:連線由對等方重置」錯誤?
    為什麼我的 PHP Curl 腳本中會出現「CURL 錯誤:接收失敗:連線由對等方重置」錯誤?
    CURL ERROR: Recv failure: Connection Reset by Peer - PHP Curl遇到「CURL ERROR: Recv failure: Connection Reset by PHP Curl 中的「peer」錯誤可能會令人困惑。 1. TCP/IP 問題...
    程式設計 發佈於2024-11-08
  • 如何使用 SimpleDateFormat 解析帶有「Z」文字的日期?
    如何使用 SimpleDateFormat 解析帶有「Z」文字的日期?
    在 SimpleDateFormat 日期解析中處理 'Z' 文字在日期解析領域,'Z' 文字具有特殊的意義。它用作指示指定時間使用 UTC 作為參考點的標記。然而,使用 SimpleDateFormat 解析帶有此文字的日期可能會對某些特定模式帶來挑戰。 如您所遇到...
    程式設計 發佈於2024-11-08
  • 檢索表單輸入時如何處理空 $_POST 值
    檢索表單輸入時如何處理空 $_POST 值
    檢查$_POST 空值透過$_POST 從表單檢索使用者輸入時,驗證該值是否為空至關重要空或為空。否則可能會導致意外行為或安全漏洞。 在提供的程式碼中,條件 if(!isset($_POST['userName'])) 檢查 'userName' 鍵是否存在於$_PO...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3