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
傑米的沙龍
8會員
30內容數
正在一點一滴學習程式,相信知識量總有一天會匯聚成大海,目前專門研究前端中。
你可能也想看
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
什麼是提升?在 JavaScript 中,提升是指變數和函數宣告會在程式執行前被「提升」到它們所在作用域(scope)的頂部。這是 JavaScript 引擎處理程式碼時的一種行為,讓你在宣告之前就能使用某些變數或函數。
Thumbnail
什麼是提升?在 JavaScript 中,提升是指變數和函數宣告會在程式執行前被「提升」到它們所在作用域(scope)的頂部。這是 JavaScript 引擎處理程式碼時的一種行為,讓你在宣告之前就能使用某些變數或函數。
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
提升(Hoisting) 指的是在創造環境階段時就把變數準備好,這時值還沒被賦予到變數上。此類型的概念可以使用執行環境的「創造階段」與「執行階段」來理解。
Thumbnail
提升(Hoisting) 指的是在創造環境階段時就把變數準備好,這時值還沒被賦予到變數上。此類型的概念可以使用執行環境的「創造階段」與「執行階段」來理解。
Thumbnail
在JS中很重要的觀念就是hoisting,中文叫做「提升」
Thumbnail
在JS中很重要的觀念就是hoisting,中文叫做「提升」
Thumbnail
前言 這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。 走入非同步之前 執行環境(Execution Context) 執行環境堆疊 (Execution stack)
Thumbnail
前言 這是第一次寫技術文章,但其實應該也只能說是蒐集很多資料並學習如何透過自己的話解釋的內容,並不能像其他大神可能分享一些很酷的技術,目標就單純是為了完成最後一週的作業(如下)。 走入非同步之前 執行環境(Execution Context) 執行環境堆疊 (Execution stack)
Thumbnail
Hoisting 可以說是 ES6 問世之後,去面試還是會爾偶被問到的面試考題,雖然 Hoisting 離 Modern JavaScript 的技術有點距離,實作上幾乎不太會用到,但透過了解 Hoisting 的概念,可以對這門語言有更深的了解與掌握度。
Thumbnail
Hoisting 可以說是 ES6 問世之後,去面試還是會爾偶被問到的面試考題,雖然 Hoisting 離 Modern JavaScript 的技術有點距離,實作上幾乎不太會用到,但透過了解 Hoisting 的概念,可以對這門語言有更深的了解與掌握度。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News