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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
這兩年都用 Elixir + Phoenix + LiveView 在開發網站,遠離雜亂的 js 生態圈。最近剛好因為有相關需求,所以就大概看一下有哪些 js library 跟 framework,有興趣的就大概摸一下,寫個粗淺的心得
選1)當初為什麼報名這堂課? 目前是資訊員在職即將滿七年了, 從當初入職完全不熟悉工作內容, 網管、設備維護要做些什麼, 不會的就東學西學, 學著跟廠商怎麼處理, 也這樣堅持過來。 我雖然是讀資訊領域相關, 但不敢說自己是工程師(所以我自稱為資訊員, 覺得自己都是會點皮毛談不上專業),
過去我嘗試學習 JS 蠻多次,常常無疾而終,因為窮所以都是看網路文章、線上課程為主,會遇到的問題有: 在職學習的惰性,只要開始加班我就忘記學習 :D 寫得太少又急著看完課程,看完後就忘光了 :DD 便宜的 Udemy 課程大都是英文,聽不懂的語言+聽不懂的邏輯,放空 :DDD 六角直播班帶給我最大的
Thumbnail
前陣子有讀者來信詢問我:「嗨!Vivian,我想要請問妳都是在哪裡學程式的呢?是實體課程嗎?」
Thumbnail
參加六角學院的 JS 工程師養成直播班,課程由洧杰老師擔任授課老師,總共有九週的線上直播課程以及課前知識補充的學習影片,與大家分享此次直播班的簡單心得
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
這兩年都用 Elixir + Phoenix + LiveView 在開發網站,遠離雜亂的 js 生態圈。最近剛好因為有相關需求,所以就大概看一下有哪些 js library 跟 framework,有興趣的就大概摸一下,寫個粗淺的心得
選1)當初為什麼報名這堂課? 目前是資訊員在職即將滿七年了, 從當初入職完全不熟悉工作內容, 網管、設備維護要做些什麼, 不會的就東學西學, 學著跟廠商怎麼處理, 也這樣堅持過來。 我雖然是讀資訊領域相關, 但不敢說自己是工程師(所以我自稱為資訊員, 覺得自己都是會點皮毛談不上專業),
過去我嘗試學習 JS 蠻多次,常常無疾而終,因為窮所以都是看網路文章、線上課程為主,會遇到的問題有: 在職學習的惰性,只要開始加班我就忘記學習 :D 寫得太少又急著看完課程,看完後就忘光了 :DD 便宜的 Udemy 課程大都是英文,聽不懂的語言+聽不懂的邏輯,放空 :DDD 六角直播班帶給我最大的
Thumbnail
前陣子有讀者來信詢問我:「嗨!Vivian,我想要請問妳都是在哪裡學程式的呢?是實體課程嗎?」
Thumbnail
參加六角學院的 JS 工程師養成直播班,課程由洧杰老師擔任授課老師,總共有九週的線上直播課程以及課前知識補充的學習影片,與大家分享此次直播班的簡單心得