JS 學習筆記 #1 - 提升 Hoisting

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

提升(Hoisting) 指的是在創造環境階段時就把變數準備好,這時值還沒被賦予到變數上

此類型的概念可以使用執行環境的「創造階段」與「執行階段」來理解

建立執行環境有分成兩階段

  1. 創造環境:先不賦予值,只將所有變數都先挑出來,賦予記憶體,所以變數在此階段都會是 undefined
  2. 執行:將值賦予到變數上

範例

console.log(ming); //undefined
var ming = "小明";

如果以執行環境兩階段的概念來說明:

//創造階段
var ming;

//執行階段
console.log(ming);
ming = "小明";

函式陳述式在創造階段就會優先載入

在創造階段函式陳述式優先載入

範例

callName();
function callName() {
console.log("呼叫小明");
}

以創造和執行階段來說明:

//創造階段
function callName() {
console.log("呼叫小明");
}

//執行階段
callName();

函式表達式

函式表達式則是和變數相同,一開始創造階段只有變數,到執行階段才會將函式(值)賦予到變數上

範例一:函式表達式

console.log(callName); //undefined
callName(); //error: callName() is not a function

var callName = function () {
console.log("呼叫小明");
};

以創造和執行階段來說明:

//創造階段
var callName;

//執行階段
console.log(callName);
callName();

callName = function () {
console.log("呼叫小明");
};


範例二:同時出現函式陳述式和函式表達式

function callName() {
console.log("呼叫小明1");
}

var callName = function () {
console.log("呼叫小明2");
};

callName(); //呼叫小明2

以創造和執行階段來說明:

//創造
function callName() {
console.log("呼叫小明1");
}
var callName;

//執行
callName = function () {
console.log("呼叫小明2");
};

callName();


範例三:同時出現函式陳述式和函式表達式

var callName = function () {
console.log("呼叫小明2");
};

function callName() {
console.log("呼叫小明1");
}

callName(); //呼叫小明2

以創造和執行階段來說明:

//創造
//函式優先:函式陳述式在創造階段會優先載入
function callName() {
console.log("呼叫小明1");
}
var callName;

//執行
callName = function () {
console.log("呼叫小明2");
};

callName();


提升 Hoisting 練習題

第一題

callName();
function callName() {
console.log(Ming); //undefined
}
var Ming = "小明";

以創造和執行階段來說明:

//創造
function callName() {
console.log(Ming);
}
var Ming;

//執行
callName();
Ming = "小明";


第二題

function callName() {
console.log("小明");
}
callName(); //杰倫

function callName() {
console.log("杰倫");
}

callName(); //杰倫

以創造和執行階段來說明:

//創造
function callName() {
console.log(Ming);
}

function callName() {
console.log("杰倫");
}

//執行
callName();
callName();


第三題

whosName();
function whoName() {
if (name) {
name = "杰倫";
}
}
var name = "小明";
console.log(name);

用創造和執行階段來詮釋:

  1. 在創造階段就會載入函式陳述式和變數宣告
  2. 之後執行函式,並將 "小明" 賦予到 name 變數上,最終 console.log 印出來是小明
//創造階段
function whoName() {
if (name) {
name = "杰倫";
}
}
var name;

//執行階段
whosName();
name = "小明";
console.log(name);

總結

  • 在創造階段只有宣告變數,還沒賦予值,要等到執行後,才會將值賦予到變數上,在還沒執行以前,如果呼叫變數,就會得到 undefined
  • 函式陳述式會在創造階段就優先載入;函式表達式則是在創造階段宣告變數,執行階段才賦予到變數上
avatar-img
7會員
30內容數
正在一點一滴學習程式,相信知識量總有一天會匯聚成大海,目前專門研究前端中。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
傑米的沙龍 的其他內容
JavaScript 的型別可以分為兩類,分別是原始型別與物件型別,這邊主要談的是 ES6 的寫法。值得注意的是,JavaScript 變數本身不帶有型別,值才有。
JavaScript 的型別可以分為兩類,分別是原始型別與物件型別,這邊主要談的是 ES6 的寫法。值得注意的是,JavaScript 變數本身不帶有型別,值才有。
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
就是指變數可以被訪問和使用的範圍,來說一下var、let和const的作用域差異。 var :function example() { console.log(x); // 輸出: undefined 因為變量提升造成的 var x = 5; } 函數作用域或全域作用域 可以重複宣告
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本章目的是為讀者提供有關如何設置JavaScript開發環境的知識,包括在瀏覽器、Node.js和各種編輯器和IDE中編寫和運行JavaScript的信息。此外,本章還介紹了如何架設本地開發伺服器以模擬實際的網頁環境。這些知識對於希望開發前端應用或後端服務的JavaScript開發者來說都是必要的。
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
前言: 雖然前面有些定義還沒有完整的解釋,但還是後面再說吧, 誰想一直看理論啊(摔本子)
※ 認識變數: 變數(variable)是在程式裡面把東西存起來的概念。 基於不讓電腦每次都需要重新運算,把需要花時間運算的東西先存起來,之後再直接拿出來使用,所以我們需要變數。 變數儲存的位置在電腦裡的記憶體。變數就像是一個箱子,記憶體就像是一個倉庫。箱子的名稱就是變數名稱,箱子的內容物就是
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
就是指變數可以被訪問和使用的範圍,來說一下var、let和const的作用域差異。 var :function example() { console.log(x); // 輸出: undefined 因為變量提升造成的 var x = 5; } 函數作用域或全域作用域 可以重複宣告
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本章目的是為讀者提供有關如何設置JavaScript開發環境的知識,包括在瀏覽器、Node.js和各種編輯器和IDE中編寫和運行JavaScript的信息。此外,本章還介紹了如何架設本地開發伺服器以模擬實際的網頁環境。這些知識對於希望開發前端應用或後端服務的JavaScript開發者來說都是必要的。
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
前言: 雖然前面有些定義還沒有完整的解釋,但還是後面再說吧, 誰想一直看理論啊(摔本子)
※ 認識變數: 變數(variable)是在程式裡面把東西存起來的概念。 基於不讓電腦每次都需要重新運算,把需要花時間運算的東西先存起來,之後再直接拿出來使用,所以我們需要變數。 變數儲存的位置在電腦裡的記憶體。變數就像是一個箱子,記憶體就像是一個倉庫。箱子的名稱就是變數名稱,箱子的內容物就是
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。