JS學習筆記#19 | 提升(Hoisting)

更新於 發佈於 閱讀時間約 3 分鐘


什麼是提升?

在 JavaScript 中,提升是指變數和函數宣告會在程式執行前被「提升」到它們所在作用域(scope)的頂部。這是 JavaScript 引擎處理程式碼時的一種行為,讓你在宣告之前就能使用某些變數或函數。

關鍵點

  1. 只提升宣告,不提升賦值
    • 變數的宣告(比如 var x;)會被提升,但賦值(比如 x = 5;)不會。
    • 函數宣告整個會被提升,包括函數名稱和內容。
  2. 適用於 var,不完全適用於letconst
    • var 宣告的變數會被提升,並初始化為 undefined
    • letconst 也會被提升,但不會初始化,處於「暫時性死區」(Temporal Dead Zone),在宣告前使用會報錯。
  3. 函數宣告 vs 函數表達式
    • 函數宣告(function foo() {})會完整提升,可以在宣告前呼叫。
    • 函數表達式(var foo = function() {})只有變數部分提升,賦值不會提升,所以宣告前呼叫會出錯。

範例解析

範例 1:變數提升

console.log(x); // 輸出:undefined
var x = 5;
console.log(x); // 輸出:5

實際執行時,JavaScript 會把 var x 提升到頂部,但 x = 5 留在原地。也就是說

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


範例 2:letconst的行為

console.log(x); // 報錯:ReferenceError
let x = 10;

console.log(y); // 報錯:ReferenceError
const y = 10;

被提升,但未初始化,宣告前使用會進入暫時性死區。


範例 3:函數提升

foo1(); // 輸出:Hello
function foo1() {
console.log("Hello");
}

foo2(); //TypeError: foo2 is not a function
var foo2 = function () {
console.log("Hello");
}

函數宣告(Function Declaration)整個被提升,所以可以在宣告前呼叫。

函數表達式(Function Expression)使用 var 所以只有變數名稱 foo2 被提升,賦值留在原地,所以宣告前調用會失敗。


注意事項

  • 避免依賴提升:雖然提升是語言特性,但為了程式碼可讀性,最好在變數或函數使用前先宣告。
  • 作用域影響:提升只在當前作用域內生效,比如函數內的宣告不會提升到全域。


小結

提升是 JavaScript 的獨特機制,理解它能幫助你避免常見錯誤(如 undefined 或 ReferenceError)。

重點:var 提升且初始化為 undefined,let 和 const 有暫時性死區,函數宣告完全提升。



avatar-img
0會員
28內容數
留言
avatar-img
留言分享你的想法!
koko的沙龍 的其他內容
什麼是執行環境(Execution Context)? 簡單來說,執行環境是 JavaScript 程式碼執行時所在的「環境」。 它決定了程式碼如何被解析和執行,並管理變數、函數以及作用域(scope)的存取。 每當程式碼執行時,JavaScript 引擎會建立一個執行環境。
for...of 需要迭代的是具有迭代器的可迭代物件。一般的物件,除非你為它定義迭代器,否則不能使用 for...of。它主要用來迭代「值」。 for...in 迭代的是物件的可枚舉屬性,在陣列中就會迭代索引。通常用來迭代物件屬性,在陣列中較不適合,也較容易出錯。
Spread Syntax和Rest Parameters都使用 ... 符號,Spread Syntax用於展開可迭代物件,例如將陣列或物件的元素複製到新的陣列或物件中,或是在函式呼叫時傳遞參數。Rest Parameters用於收集不定數量的函數參數,將其打包成一個陣列,方便在函數內部進行處理。
身為一名女性,我常常在生活中感受到性別帶來的無形壓力。 而閱讀上野千鶴子《厭女:日本的女性嫌惡》這本書後,讓我突然意識到原來身為女性,在這個社會上彷彿在玩著一款難度超高的遊戲。
5/5厭女:日本的女性嫌惡
這個專案是一個使用 Vue3、Vite、daisyUI 和 Google Gemini AI API 打造的雙 AI 對話模擬器。 使用者可以設定兩個 AI 角色的名稱和描述,然後讓它們自行對話。 這個專案旨在展示前端如何與 AI API 互動,以及如何建立具有互動性的 AI 應用程式。
箭頭函式是 JavaScript ES6(ECMAScript 2015)引入的一種簡化 Function Expression 語法。 它用來快速定義匿名函式,語法簡潔,特性明確,特別適合用於回呼函式等場景。
什麼是執行環境(Execution Context)? 簡單來說,執行環境是 JavaScript 程式碼執行時所在的「環境」。 它決定了程式碼如何被解析和執行,並管理變數、函數以及作用域(scope)的存取。 每當程式碼執行時,JavaScript 引擎會建立一個執行環境。
for...of 需要迭代的是具有迭代器的可迭代物件。一般的物件,除非你為它定義迭代器,否則不能使用 for...of。它主要用來迭代「值」。 for...in 迭代的是物件的可枚舉屬性,在陣列中就會迭代索引。通常用來迭代物件屬性,在陣列中較不適合,也較容易出錯。
Spread Syntax和Rest Parameters都使用 ... 符號,Spread Syntax用於展開可迭代物件,例如將陣列或物件的元素複製到新的陣列或物件中,或是在函式呼叫時傳遞參數。Rest Parameters用於收集不定數量的函數參數,將其打包成一個陣列,方便在函數內部進行處理。
身為一名女性,我常常在生活中感受到性別帶來的無形壓力。 而閱讀上野千鶴子《厭女:日本的女性嫌惡》這本書後,讓我突然意識到原來身為女性,在這個社會上彷彿在玩著一款難度超高的遊戲。
5/5厭女:日本的女性嫌惡
這個專案是一個使用 Vue3、Vite、daisyUI 和 Google Gemini AI API 打造的雙 AI 對話模擬器。 使用者可以設定兩個 AI 角色的名稱和描述,然後讓它們自行對話。 這個專案旨在展示前端如何與 AI API 互動,以及如何建立具有互動性的 AI 應用程式。
箭頭函式是 JavaScript ES6(ECMAScript 2015)引入的一種簡化 Function Expression 語法。 它用來快速定義匿名函式,語法簡潔,特性明確,特別適合用於回呼函式等場景。
你可能也想看
Google News 追蹤
先學習 HTML, CSS, JavaScript 基礎觀念, 再透過實作專案,慢慢熟悉不同的語法使用方式。
就是指變數可以被訪問和使用的範圍,來說一下var、let和const的作用域差異。 var :function example() { console.log(x); // 輸出: undefined 因為變量提升造成的 var x = 5; } 函數作用域或全域作用域 可以重複宣告
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
Thumbnail
CSS 的繼承性是開發網頁樣式時的一個重要概念,它使得樣式設計更加靈活和高效,有助於提高程式碼的可讀性、一致性和可重用性,並加快開發速度,從而提供更好的開發體驗。
前言: 一直想要把自己的學習筆記整理整理,至少在寫下筆記的時候,也能釐清觀念。 結果拖延到現在,終於要提筆了,不知道能堅持多久(???)。
Thumbnail
針對 JavaScript 中的原始型別和隱性轉型進行了詳細的探討
Thumbnail
學習JavaScript的理由有很多,包括容易學習的程式語言、互動式體驗、多功能性、跨平臺、社群和資源豐富、高市場需求。此外,文章提供了設計和前端教學的相關資源連結。文章中還提到了一些與學習JavaScript相關的教學文章和影音教學資源。
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
提升(Hoisting) 指的是在創造環境階段時就把變數準備好,這時值還沒被賦予到變數上。此類型的概念可以使用執行環境的「創造階段」與「執行階段」來理解。
先學習 HTML, CSS, JavaScript 基礎觀念, 再透過實作專案,慢慢熟悉不同的語法使用方式。
就是指變數可以被訪問和使用的範圍,來說一下var、let和const的作用域差異。 var :function example() { console.log(x); // 輸出: undefined 因為變量提升造成的 var x = 5; } 函數作用域或全域作用域 可以重複宣告
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
Thumbnail
CSS 的繼承性是開發網頁樣式時的一個重要概念,它使得樣式設計更加靈活和高效,有助於提高程式碼的可讀性、一致性和可重用性,並加快開發速度,從而提供更好的開發體驗。
前言: 一直想要把自己的學習筆記整理整理,至少在寫下筆記的時候,也能釐清觀念。 結果拖延到現在,終於要提筆了,不知道能堅持多久(???)。
Thumbnail
針對 JavaScript 中的原始型別和隱性轉型進行了詳細的探討
Thumbnail
學習JavaScript的理由有很多,包括容易學習的程式語言、互動式體驗、多功能性、跨平臺、社群和資源豐富、高市場需求。此外,文章提供了設計和前端教學的相關資源連結。文章中還提到了一些與學習JavaScript相關的教學文章和影音教學資源。
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
提升(Hoisting) 指的是在創造環境階段時就把變數準備好,這時值還沒被賦予到變數上。此類型的概念可以使用執行環境的「創造階段」與「執行階段」來理解。