JavaScript 入門:提升 Hoisting 是什麼?

更新 發佈閱讀 5 分鐘
JavaScript Hoisting 提升

JavaScript Hoisting 提升

什麼是提升 Hoisting

Hoisting 指的是,JavaScript 在執行程式碼之前,先掃瞄整個作用域,並將宣告拉到作用域最上方的行為。

Hoisting 只會提升宣告,不會提升賦值。

但是一定要注意,前面提到的「拉到上方」並不真正的搬動程式碼!! 因為 JavaScript 在執行前會先建立執行環境(Execution Context),這時需要先替變數與函式配置記憶體空間,因此會出現這種「宣告被搬到前面」、「宣告的程式碼看起來可用」的狀況。


變數宣告的提升

var 的提升

範例

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

結果

undefined

這個例子中,程式會正常執行不報錯,但是印出 undefined

因為 var 宣告的 a 被提升了,而賦值的程式碼還留在原地, JS 執行起來會像是:

var a; // 宣告被提升
console.log(a); // 嘗試印一個還沒被賦值的 a
a = 10; // 賦值

這也是為何會出現 undefined 的原因。


let/ const 的提升

let 範例

console.log(b); 
let ​b = 10;

let 結果

ReferenceError: Cannot access 'b' before initialization

const 範例

console.log(c); 
const ​c = 10;

const 結果

ReferenceError: Cannot access 'c' before initialization

從結果看來,不論是 letconst,兩者在宣告前嘗試先存取變數都會出現錯誤,這是因為 letconst 雖然在提升時期都會被建立,但是並沒有被初始化,這段期間也被稱做進入暫時死區 temporal dead zone。


函式宣告的提升

函式宣告式 Function declaration 的提升

函式宣告式指的是用 function 關鍵字宣告的有名函式。函式宣告式會被提升,所以可以在程式中的任一地方呼叫,如下方範例:

sayHi();
function sayHi(){
console.log("Hi");
}

這段程式的結果可以正確印出 "Hi" ,因為整個函式都被提升。

函式表達式 Function expression 的提升

另一種宣告函式的方法叫做函式表達式,意思是將函式賦值到宣告的變數。在這種宣告方式下,指有被宣告的變數會被提升,函式內容還停留在原地,因此會出現錯誤。

但是具體報錯的訊息會取決自接受的變數類型

sayHi();

var sayHi = function(){
console.log("Hi");
}

以 var 的範例來說,會出現:

TypeError: sayHi is not a function

而將變數替換為 let/const 宣告,則會出現:

ReferenceError: Cannot access 'sayHi' before initialization

總結

JavaScript 在建立執行環境時會將變數、函數的宣告邏輯移到作用域頂端,這樣的情況稱作提升 Hoisting。

  • 變數、函式的宣告都會有提升情況
  • 只有宣告會提升,「賦值」不會被移動
  • var 在提升時會初始化成 undefined
  • let/const 不會初始化,會進入暫時死區 temporal dead zone
  • 函式宣告式 function declaration 會被完整提升,函式表達式則只有宣告會被提升

參考

  1. 什麼是提升 (Hoisting)?
  2. 在 JavaScript 中用 var, let, 以及 const 有什麼差別?什麼時候該用哪個?
  3. [筆記]-JavaScript 提升(Hoisting)是什麼?關於提升的5個觀念
留言
avatar-img
Elaine 粼粼的林林總總
17會員
40內容數
不定期地分享程式/旅遊/學習/閱讀或各式各樣的文章,如果對我的分享有興趣,歡迎來找我玩~
2026/02/06
閉包 (Closure) 是 JavaScript 核心觀念之一,指函式與其建立時的詞法環境結合。因為詞法作用域在宣告時就決定變數存取範圍,即使外層函式執行完畢,內部函式仍能存取外部變數。本文透過實例解析閉包原理與實際應用。
2026/02/06
閉包 (Closure) 是 JavaScript 核心觀念之一,指函式與其建立時的詞法環境結合。因為詞法作用域在宣告時就決定變數存取範圍,即使外層函式執行完畢,內部函式仍能存取外部變數。本文透過實例解析閉包原理與實際應用。
2026/02/05
開發 JavaScript 程式時,了解作用域的概念是非常重要的事情。本篇文章介紹了 JS 的三種作用域:全域作用域、函式作用域、區塊作用域以及作用域鏈的概念。
2026/02/05
開發 JavaScript 程式時,了解作用域的概念是非常重要的事情。本篇文章介紹了 JS 的三種作用域:全域作用域、函式作用域、區塊作用域以及作用域鏈的概念。
2026/02/04
為什麼 JavaScript 中的字串無法修改?為什麼複製變數後,改變其中一個會影響另一個?本文將深入解析 JavaScript 的原生值 (primitive values) 與物件 (objects) 的運作機制,說明傳值與傳參考的差異,避免非預期的程式行為,提升開發效率!!
Thumbnail
2026/02/04
為什麼 JavaScript 中的字串無法修改?為什麼複製變數後,改變其中一個會影響另一個?本文將深入解析 JavaScript 的原生值 (primitive values) 與物件 (objects) 的運作機制,說明傳值與傳參考的差異,避免非預期的程式行為,提升開發效率!!
Thumbnail
看更多
你可能也想看
Thumbnail
每年一次的 State of JS 問卷調查,不只是觀察前端技術趨勢的工具,更是檢視自身技能與學習方向的絕佳機會。透過這份調查,你可以了解前端生態的變化,確保自己沒有錯過重要資訊,並規劃未來的學習路線。
Thumbnail
每年一次的 State of JS 問卷調查,不只是觀察前端技術趨勢的工具,更是檢視自身技能與學習方向的絕佳機會。透過這份調查,你可以了解前端生態的變化,確保自己沒有錯過重要資訊,並規劃未來的學習路線。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
iFrame在微前端架構中的優缺點,分析了其對用戶體驗、SEO及性能的影響。 iFrame在嵌入小型UI元件、創建隔離環境等特定場景中仍具備相當的應用價值。
Thumbnail
iFrame在微前端架構中的優缺點,分析了其對用戶體驗、SEO及性能的影響。 iFrame在嵌入小型UI元件、創建隔離環境等特定場景中仍具備相當的應用價值。
Thumbnail
這篇文章深入淺出地解釋 JavaScript 中表達式 (expression) 與陳述式 (statement) 的差異,並以 React 中 JSX 的應用為例,說明為何大括號 {} 內只能放入表達式。文章以類比人類語言的句子結構來幫助理解,並提供相關參考資料連結。
Thumbnail
這篇文章深入淺出地解釋 JavaScript 中表達式 (expression) 與陳述式 (statement) 的差異,並以 React 中 JSX 的應用為例,說明為何大括號 {} 內只能放入表達式。文章以類比人類語言的句子結構來幫助理解,並提供相關參考資料連結。
Thumbnail
JavaScript 的事件處理是網頁開發中的重要部分,本文將介紹兩個常用的方法:event.stopPropagation() 與 event.preventDefault(),並簡要說明它們的作用與使用情境。
Thumbnail
JavaScript 的事件處理是網頁開發中的重要部分,本文將介紹兩個常用的方法:event.stopPropagation() 與 event.preventDefault(),並簡要說明它們的作用與使用情境。
Thumbnail
分享這套功能齊全,視覺超級可愛還有響應式變化,教學文件又很容易閱讀的套件 Evo Calendar。 當初在製作 JS side project 時,想找一個與 VCalendar 視覺相近的套件,但多半都不合意。六角學院指派的 side project 教練也幫我找了另一個純 JS 的範例,也很
Thumbnail
分享這套功能齊全,視覺超級可愛還有響應式變化,教學文件又很容易閱讀的套件 Evo Calendar。 當初在製作 JS side project 時,想找一個與 VCalendar 視覺相近的套件,但多半都不合意。六角學院指派的 side project 教練也幫我找了另一個純 JS 的範例,也很
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
什麼是執行環境(Execution Context)? 簡單來說,執行環境是 JavaScript 程式碼執行時所在的「環境」。 它決定了程式碼如何被解析和執行,並管理變數、函數以及作用域(scope)的存取。 每當程式碼執行時,JavaScript 引擎會建立一個執行環境。
Thumbnail
什麼是執行環境(Execution Context)? 簡單來說,執行環境是 JavaScript 程式碼執行時所在的「環境」。 它決定了程式碼如何被解析和執行,並管理變數、函數以及作用域(scope)的存取。 每當程式碼執行時,JavaScript 引擎會建立一個執行環境。
Thumbnail
在 JavaScript 中,變數是一個儲存值的容器,可用於管理和操作資料。變數可以透過 let、const 和 var 進行宣告。選擇適當的變數宣告方式是確保程式碼可讀性和可維護性的關鍵。
Thumbnail
在 JavaScript 中,變數是一個儲存值的容器,可用於管理和操作資料。變數可以透過 let、const 和 var 進行宣告。選擇適當的變數宣告方式是確保程式碼可讀性和可維護性的關鍵。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News