」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 了解 JavaScript 中的提升:綜合指南

了解 JavaScript 中的提升:綜合指南

發佈於2024-11-05
瀏覽:959

Understanding Hoisting in JavaScript: A Comprehensive Guide

JavaScript 中的提升

提升是一種行為,其中變數和函數聲明在先前被移動(或「提升」)到其包含範圍(全域範圍或函數範圍)的頂部程式碼被執行。這意味著您可以在程式碼中實際聲明變數和函數之前使用它們。

變數提升

變數

  • 用 var 宣告的變數被提升到其作用域的頂部,但它們的值直到程式碼中發生賦值的點才被初始化。
console.log(x); // undefined
var x = 5;
console.log(x); // 5

讓和常數

  • 用 let 和 const 宣告的變數也會被提升,但會被放置在「臨時死區」中,直到到達它們的宣告為止。在聲明之前訪問它們將導致引用錯誤。
console.log(y); // ReferenceError: Cannot access 'y' before initialization
let y = 10;

// block scope
{
  let x = 5;
}

console.log(x); // ReferenceError: x is not defined

函數提升

傳統功能

  • 函數宣告被完全提升,這意味著宣告和函數體都被移動到作用域的頂端。這允許您在程式碼中聲明函數之前調用該函數。
sayHello(); // "Hello!"
function sayHello() {
  console.log("Hello!");
}
  • 相反,函數表達式(其中將函數分配給變數)僅作為變數提升,因此在初始化變數之前調用它們將導致未定義或類型錯誤。
greet(); // TypeError: greet is not a function
var greet = function () {
  console.log("Hi!");
};

greet(); // ReferenceError: Cannot access 'one' before initialization
let greet = function () {
  console.log("Hi!");
};

箭頭功能

  • 相反,函數表達式(其中將函數分配給變數)僅作為變數提升,因此在初始化變數之前調用它們將導致未定義或類型錯誤。
greet(); // TypeError: greet is not a function
var greet = () => {
  console.log("Hi!");
};

greet(); // ReferenceError: Cannot access 'one' before initialization
let greet = function () {
  console.log("Hi!");
};

暫時死區 (TDZ)

臨時死區 (TDZ) 對於使用 let 和 const 宣告的變數存在,因為 JavaScript 旨在防止您在宣告和初始化這些變數之前存取它們。

為什麼 var 和 let、const 在提升中表現不同

  • 這是因為JavaScript的歷史演變。
  • 最初,JavaScript 是為非開發人員的使用者設計的,JavaScript 的主要核心用途是為網頁添加小型互動元素。
  • 所以 var 只支援函數作用域。同樣在那個時候,還沒有塊作用域。
  • 但在 JavaScript 的後期發展中,使用 var 和修復 bug 變得更加複雜。
  • 因此,為了讓 JavaScript 與其他現代語言競爭,增加了更多功能,如 let、const、箭頭函數、ES6 方法等。

為什麼 var 不像 let 和 const 那樣更新

  • 這是因為向後相容。
  • 當時,JavaScript已被許多企業廣泛使用,因此更新或變更現有功能會導致程式碼庫的破壞。
  • 因此,單獨添加了現代功能。

常見面試問題

  • JavaScript 中什麼是提升?
  • JavaScript 中什麼是提升的,什麼不是?
  • var、let 和 const 在提升方面有什麼不同?
  • JavaScript 中的臨時死區 (TDZ) 是什麼?
  • 您能解釋一下使用函數宣告與函數表達式進行提升嗎?
  • ES6模組中的提升是什麼?
  • 為什麼我們應該避免在現實程式碼中依賴提升?

概括

  • 提升是 JavaScript 中的預設行為,其中變數和函數宣告在編譯階段被移到各自作用域的頂部。
  • 提升僅適用於使用 var 和傳統函數宣告的變量,不適用於 let、const 和箭頭函數。
  • 只有函數聲明被提升,所以傳統函數可以工作,但如果函數被分配給變量,則在定義之前它是不可調用的。
  • 之所以var和傳統函數被提升,而let、const和箭頭函數沒有被提升,是因為在初期,JavaScript主要用於小型UI交互。
  • 但後來,隨著 JavaScript 被廣泛用於企業建立應用程序,僅在全局範圍內修復錯誤變得更加困難。
  • 因此,在未來的更新中,會解決更多安全性問題。
  • 此外,更新現有功能會破壞程式碼庫,因此單獨新增功能。
版本聲明 本文轉載於:https://dev.to/nishanthank/understanding-hoisting-in-javascript-a-comprehensive-guide-5bic?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何從2D數組中提取元素?使用另一數組的索引
    如何從2D數組中提取元素?使用另一數組的索引
    Using NumPy Array as Indices for the 2nd Dimension of Another ArrayTo extract specific elements from a 2D array based on indices provided by a second ...
    程式設計 發佈於2025-04-22
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-04-22
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-04-22
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-04-22
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-04-22
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制,控制元素的滾動行為對於確保用戶體驗和可訪問性是必不可少的。一種這樣的方案涉及限制動態大小的父元素中元素的滾動範圍。 問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限...
    程式設計 發佈於2025-04-22
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-04-22
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-04-22
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-04-22
  • 使用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-22
  • 在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-22
  • Java開發者如何保護數據庫憑證免受反編譯?
    Java開發者如何保護數據庫憑證免受反編譯?
    在java 在單獨的配置文件保護數據庫憑證的最有效方法中存儲憑據是將它們存儲在單獨的配置文件中。該文件可以在運行時加載,從而使登錄數據從編譯的二進製文件中遠離。 使用prevereness class import java.util.prefs.preferences; 公共類示例{ 首選...
    程式設計 發佈於2025-04-22
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, AttributeError: SomeClass...
    程式設計 發佈於2025-04-22
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    程式設計 發佈於2025-04-22
  • 如何避免Go語言切片時的內存洩漏?
    如何避免Go語言切片時的內存洩漏?
    ,a [j:] ...雖然通常有效,但如果使用指針,可能會導致內存洩漏。這是因為原始的備份陣列保持完整,這意味著新切片外部指針引用的任何對象仍然可能佔據內存。 copy(a [i:] 對於k,n:= len(a)-j i,len(a); k
    程式設計 發佈於2025-04-22

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

Copyright© 2022 湘ICP备2022001581号-3