JavaScript淺嚐紀錄No.6-函式封裝(Encapsulation)?回調(Callback Function)

更新 發佈閱讀 10 分鐘

函式

結構

請先參考JavaScript淺嚐紀錄No.2-JS的中變數、函式的潛規則,就不再贅述了。

封裝(Encapsulation)

在上Alpha Camp線上課程時,發現了一個特殊的名詞封裝,一開始並不是很注意這個名詞,但是在寫筆記想介紹封裝時,卻發現解釋不出來他的定義,於是又開始了大量查找資料的旅程,但還是只能簡單的介紹,讓自己先有個概念。

在MDN上對於封裝有這樣的解釋:

Encapsulation is the packing of data and functions into one component (for example, a class) and then controlling access to that component to make a “blackbox” out of the object. Because of this, a user of that class only needs to know its interface (that is, the data and functions exposed outside the class), not the hidden implementation.

另一個簡短的介紹:將資料與方法包裝在一起使用。

function hotel(name, rooms, booked) {

this.name = name

this.rooms = rooms

this.booked = booked

this.available = function () {

return this.rooms - this.booked

}

}

let WHotel = new hotel('WHotel', 100, 30)

let SHotel = new hotel('SHotel', 140, 50)

console.log(WHotel) //{name: "WHotel", rooms: 100, booked: 30, available: ƒ}

console.log(SHotel) //{name: "SHotel", rooms: 140, booked: 50, available: ƒ}

上面程式碼中,利用建構函式來創建WhotelSHotel,但是WhotelSHotel並不會知道算出剩餘房間(available)的程式碼,它們只是能夠使用該方法,這個概念就是封裝(Encapsulation)。

封裝的目的是甚麼?

讓使用者不會更動到原始程式碼,甚麼意思?請看下面程式碼:

function hotel(name, rooms, booked) {

this.name = name

this.rooms = rooms

this.booked = booked

this.available = function () {

return this.rooms - this.booked

}

}

let WHotel = new hotel('WHotel', 100, 30)

let SHotel = new hotel('SHotel', 140, 50)

WHotel.name = 'PHotel'

console.log(WHotel) //{name: "PHotel", rooms: 100, booked: 30, available: ƒ}

console.log(SHotel) //{name: "SHotel", rooms: 140, booked: 50, available: ƒ}

利用WHotel.name = 'PHotel'變更WHotel的名字,但是SHotel並不會受到WHotel改名的影響,創建出來的變數WHotelSHotel不論有何變動,都不會影響到原始程式碼function hotel(){...}的內容,這就是封裝的概念,確保使用者無法任意更改物件內部的重要資料。

參考資料:


MDN-JavaScript 物件導向介紹


維基百科-封裝 (物件導向程式設計)


李重楼-JavaScript的封装


回調(Callback Function)

在JavaScript Is Sexy裡的介紹:

A callback function, also known as a higher-order function, is a function that is passed to another function (let’s call this other function “otherFunction”) as a parameter, and the callback function is called (or executed) inside the otherFunction.

When we pass a callback function as an argument to another function, we are only passing the function definition. We are not executing the function in the parameter.Note that the callback function is not executed immediately. It is “called back” (hence the name) at some specified point inside the containing function’s body. 


也就是說A函示是作為參數值(argument)被傳給B函示(又被稱作higher-order function),並且這個A函示只有在指定的狀況才會執行。

var friends = ["A", "B", "C", "D"];

friends.forEach(function (friend, index){

console.log(index + 1 + ". " + friend);

});

forEach()之後執行裡面的匿名函式,這樣的概念也就是**回調(Callback function)**。

在jQuery中也運用很多回調:

$("#btn_1").click(function() {

alert("Btn 1 Clicked");

});

click()之後執行裡面的匿名函式。

千萬不能在function() {alert("Btn 1 Clicked");}之後加上(),這樣會變成馬上執行這個function

上面用的都是匿名函式,當然也可以使用命名函式來做回調函式,同樣的不能在作為引數時加上()

function study(name) {

console.log(`${name} is STUDYING !`)

}

function eat(name,callback) {

console.log(`${name} is EATING !`)

callback(name)

}

eat('Mark',study)

函式eat執行完之後會執行函式study,並且可以在callback(parameter)中放入參數,執行函式eat時會將該參數值再帶入函式study裡當成引數喔。

在JavaScript Is Sexy-Understand JavaScript Callback Functions and Use Them,有看到一個建議:在執行Callback Function時要先確定Callback是一個函式。

如下:

function study(name) {

console.log(`${name} is STUDYING !`)

}

function eat(name,callback) {

console.log(`${name} is EATING !`)

// Make sure the callback is a function

if (typeof callback === "function") {

// Call it, since we have confirmed it is callable

callback(name);

}

}

eat('Mark',study)

參考資料:

JavaScript Is Sexy-Understand JavaScript Callback Functions and Use Them

菜鳥工程師 肉豬-JavaScript 什麼是Callback函式 (Callback Function)?


留言
avatar-img
鍋灶的熱湯
1會員
13內容數
分享生活、旅行經驗,經驗是種解決問題的方式,方式不只一種歡迎大家一起分享經驗
鍋灶的熱湯的其他內容
2026/03/05
物件(Object) MDN中如此介紹: 物件是一批相關的數據以及/或者功能,可裝載相關的資料與程式碼,資料部分是你塑造某個模型的資訊,而程式碼部分則用是操作行為(Method)實現。Object data – 函式部分通常也使用 —可工整地儲存 (正式一點應該是封裝 Encapsulated)
Thumbnail
2026/03/05
物件(Object) MDN中如此介紹: 物件是一批相關的數據以及/或者功能,可裝載相關的資料與程式碼,資料部分是你塑造某個模型的資訊,而程式碼部分則用是操作行為(Method)實現。Object data – 函式部分通常也使用 —可工整地儲存 (正式一點應該是封裝 Encapsulated)
Thumbnail
2026/03/05
let array = [0,1,2,3,4] array.unshift(5) //在第一個位置加入5,原陣列值往後移動1個位置 console.log(array) //[5,0,1,2,3,4]資料結構 (data structure) 資料結構是電腦中儲存、組織資料的方式, 陣列資料結構
Thumbnail
2026/03/05
let array = [0,1,2,3,4] array.unshift(5) //在第一個位置加入5,原陣列值往後移動1個位置 console.log(array) //[5,0,1,2,3,4]資料結構 (data structure) 資料結構是電腦中儲存、組織資料的方式, 陣列資料結構
Thumbnail
2026/03/03
ECMAScript標準定義的七種資料型別 基本型別 (primitive type) String-字串”hello”。 Number-數字 (在 -(253 -1) and 253 -1 之間的數字), +Infinity、-Infinity、NaN也是數字型別。  Boolean-布林
2026/03/03
ECMAScript標準定義的七種資料型別 基本型別 (primitive type) String-字串”hello”。 Number-數字 (在 -(253 -1) and 253 -1 之間的數字), +Infinity、-Infinity、NaN也是數字型別。  Boolean-布林
看更多
你可能也想看
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
學習程式設計不再困難!本文提供一份循序漸進的 JavaScript 教學,每天只需 10 分鐘,就能從基礎語法到專案實作,逐步學習網頁開發,包含 HTML、CSS、JavaScript、DOM 操作、Canvas 等,並以 Road Map 呈現學習進度。即使零基礎也能輕鬆入門,開啟程式設計之路。
Thumbnail
學習程式設計不再困難!本文提供一份循序漸進的 JavaScript 教學,每天只需 10 分鐘,就能從基礎語法到專案實作,逐步學習網頁開發,包含 HTML、CSS、JavaScript、DOM 操作、Canvas 等,並以 Road Map 呈現學習進度。即使零基礎也能輕鬆入門,開啟程式設計之路。
Thumbnail
在現代 Web 開發中,框架的規範性對於團隊合作至關重要。這不僅提高了程式碼的一致性,也降低了理解他人程式碼的時間成本。現在,我們將以 JavaScript 為例,展示如何使用關注點分離的原則來撰寫一個簡單的應用喔。
Thumbnail
在現代 Web 開發中,框架的規範性對於團隊合作至關重要。這不僅提高了程式碼的一致性,也降低了理解他人程式碼的時間成本。現在,我們將以 JavaScript 為例,展示如何使用關注點分離的原則來撰寫一個簡單的應用喔。
Thumbnail
如果你曾經撰寫過網頁,那你一定接觸過 JavaScript 無論是在 NodeJs 或是瀏覽器中運行。 但你有沒有想過,我們寫下的 JS 程式碼,這些看似單純的英文和符號,是如何被轉化為機器能夠理解和執行的程式呢? 今天,讓我們一起深入了解其中的核心主角 ——Google 開發的開源 Java
Thumbnail
如果你曾經撰寫過網頁,那你一定接觸過 JavaScript 無論是在 NodeJs 或是瀏覽器中運行。 但你有沒有想過,我們寫下的 JS 程式碼,這些看似單純的英文和符號,是如何被轉化為機器能夠理解和執行的程式呢? 今天,讓我們一起深入了解其中的核心主角 ——Google 開發的開源 Java
Thumbnail
JSON 全名 JavaScript Object Notation,其格式基本上就是key: value的組成如下: { "name": "Bob", "age": 40, "childs": [ { "name": "Justin", "
Thumbnail
JSON 全名 JavaScript Object Notation,其格式基本上就是key: value的組成如下: { "name": "Bob", "age": 40, "childs": [ { "name": "Justin", "
Thumbnail
JavaScript 中的 ESM(ES Modules)和 CJS(CommonJS)是用於模塊化開發的兩種不同的模組系統。 關於CJS CJS 是 CommonJS 的模塊系統,最初是為了在伺服器端使用的 Node.js 開發而設計的,但也被廣泛用於前端開發。CJS 使用 require 函數來
Thumbnail
JavaScript 中的 ESM(ES Modules)和 CJS(CommonJS)是用於模塊化開發的兩種不同的模組系統。 關於CJS CJS 是 CommonJS 的模塊系統,最初是為了在伺服器端使用的 Node.js 開發而設計的,但也被廣泛用於前端開發。CJS 使用 require 函數來
Thumbnail
自己在剛開始進入前端領域時,很剛好遇上需要使用 TypeScript 的案子,一開始都是跟著前輩怎麼寫就怎麼寫,不太有其他餘力來思考「為什麼」會需要寫這門程式語言,直到自己後來使用了 TypeScript 完整開發了電商的購物流程,才慢慢理解到使用 TypeScript 的好處與優勢。
Thumbnail
自己在剛開始進入前端領域時,很剛好遇上需要使用 TypeScript 的案子,一開始都是跟著前輩怎麼寫就怎麼寫,不太有其他餘力來思考「為什麼」會需要寫這門程式語言,直到自己後來使用了 TypeScript 完整開發了電商的購物流程,才慢慢理解到使用 TypeScript 的好處與優勢。
Thumbnail
在初學程式的時候,我曾經看室友開發專案到一半時,突然坐在那發呆,於是我好奇一問,室友說:「我在等程式編譯完成啊。」 還記得當初還是程式小菜雞的我,懞懂無知的說:「編譯?哈哈哈,我們 JavaScript 都不需要編譯耶,可以直接跑在瀏覽器上。」 室友一臉莫名其妙地回我:「噢,是嗎⋯⋯」
Thumbnail
在初學程式的時候,我曾經看室友開發專案到一半時,突然坐在那發呆,於是我好奇一問,室友說:「我在等程式編譯完成啊。」 還記得當初還是程式小菜雞的我,懞懂無知的說:「編譯?哈哈哈,我們 JavaScript 都不需要編譯耶,可以直接跑在瀏覽器上。」 室友一臉莫名其妙地回我:「噢,是嗎⋯⋯」
Thumbnail
許多初學網頁開發的朋友們,一開始都不太理解HTML、CSS、 JavaScript之間的差異性,導致初期規劃學習計畫時毫無頭緒。 會有這樣的困擾,主要在於不了解HTML、CSS、 JavaScript之間的關係,以及這三者在網頁運作時所扮演什麼角色,導致越學越阿雜的狀況。
Thumbnail
許多初學網頁開發的朋友們,一開始都不太理解HTML、CSS、 JavaScript之間的差異性,導致初期規劃學習計畫時毫無頭緒。 會有這樣的困擾,主要在於不了解HTML、CSS、 JavaScript之間的關係,以及這三者在網頁運作時所扮演什麼角色,導致越學越阿雜的狀況。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News