Skip to main content

Command Palette

Search for a command to run...

JS - 簡單的例子來解釋 apply、call、bind

Published
•View as Markdown
Y

一言敝之就是職業婦女。

這三者 為 JavaScript 中常用的函數操作,它們在不同情況下有不同的用途和差異:

用一個簡單的例子來解釋 apply、call、bind,我創建一個 Yukki的 object,裡面記錄了name, money,atm, atm 為一個function,可自動幫我存錢到錢包。

const Yukki = {
  name: 'Yukki',
  money: 1000,
  atm: function (moeny) {
      this.money += moeny
  }
}

當我執行

Yukki.atm(1000)

// 會得到以下結果,moeny自動幫我存錢1000,原本只有1000+1000=2000
{name: 'Yukki', money: 2000, atm: ƒ}

今天我的女兒,Crystal只有50塊(小孩子可不能給太多錢)

const Crystal = {
  name: 'Carystal',
  money: 50
}

她收到紅包錢,可她還沒有申請任何ATM,於是她借用了我的ATM帳戶,那麼他可以透過apply來使用我的ATM

//Yukki.atm.apply(誰要用, [存多少])
Yukki.atm.apply(Crystal, [1000])

// 會得到以下結果
{name: 'Carystal', money: 1050}

為了能更方便解釋apply與call差別,我將 Yukki 的 atm function修改以下:

const Yukki = {
  name: 'Yukki',
  money: 1000,
  atm: function (moeny, change) {
      // 除了原本的 money 再加上 change 零用錢
      this.money += (moeny + change)
  }
}

apply

const Crystal = {
  name: 'Carystal',
  money: 50
}
// apply,透過array方式傳遞參數
Yukki.atm.apply(Crystal, [100, 50])
// 會得到以下結果
{name: 'Carystal', money: 200}

call

const Crystal = {
  name: 'Carystal',
  money: 50
}
// call,參數需要一個一個傳參進去
Yukki.atm.call(Crystal, 100, 50)
// 會得到以下結果
{name: 'Carystal', money: 200}

bind

const Crystal = {
  name: 'Carystal',
  money: 50
}
// bind,和 call 一樣透過傳參,但不會馬上執行,而是返回function,等下次調用時才會執行
const CrystalAtm = Yukki.atm.bind(crystal)
CrystalAtm(100, 50)
// 會得到以下結果
{name: 'Carystal', money: 200}

除了這個也可以透過 function 來解釋apply call bind三者用法不同

function getProfile(name, age) {
    console.log(`Hello,I’m ${name}, ${age} years old.`)
}
// apply,透過array方式傳遞參數
getProfile.apply(null, ['Yukki', 35])

// call,參數需要一個一個傳參進去
getProfile.call(null, 'Yukki', 35)

// bind,和 call 一樣透過傳參,但不會馬上執行,而是返回function,等下次調用時才會執行
const getting = getProfile.bind(null, 'Yukki', 35)
getting()

const person = { name: "Yukki" }

function sayHi(age) {
  return `${this.name} is ${age}`
}

console.log(sayHi.call(person, 21))
console.log(sayHi.bind(person, 21))

會出現什麼?
Yukki is 21
function

因為bind只會返回function,下次調用才會執行

More from this blog

Uncaught Error: Minified React error #329 發生以及可能解決方向

重點:Minified React error #329(Unknown root exit status)常見於 SSR 與 CSR 首次渲染輸出不一致(資料或節點結構不同)。 1. 現象 狀況條件表徵 首次載入/重新整理偶發錯誤無法重現的環境使用慢速網路(3G) + 可重現的環境機率出現Console 拋 #329 首屏閃動 / 全量替換SSR 已渲染列表, CSR 初始為空UI 閃爍/卡住/無動作 浮動元件顯示異常條件 mount 多個節點位置跳動 / 佈局不穩 2...

Nov 17, 2025

Redmine 好用的 Raycast 插件與自製好用 plug-in

我是 Raycast 的愛用者 <3 工作上常需要使用 Eedmine 切卡,看 task 之類的,我個人偏好Asana or Jira 自動化和更完整串流整個公司流程的任務,可本人就是適應力強,縱使覺得不太習慣的工作(謙虛的說法)也會想辦法搞得好用 推薦一個插件,和我自己寫的 plug-in jwicker 寫的 Raycast Redmine https://www.raycast.com/jwickers/redmine 此插件可以在 Raycast 中快速搜尋並開啟 Redmine 的 ...

Nov 10, 2025

前端踩坑實錄:用 user-scalable=0 擋放大,還有哪些更溫柔的做法?

其實沒有,還是只有那兩招。 這個議題早些年常遇到,即時現在還是常遇到(?還是一樣重寫解法,專案中有搜尋部分,在特定型號 iOS 18.4, iPhone 16 Plus 再點開搜尋(input) 會自動放大,如下圖,我應該都有好好碼到吧(? 會發現 input 焦點後,畫面會被 zoom in 放大,主要原因 行動版(特別是 iOS Safari)特定版本下(比如本案是在 iOS 18.4, iPhone 16 Plus下) 在點擊 input/textarea 時,若字體小於 16px,...

Nov 7, 2025

切一下,世界安靜了:aten 的 Kvm Us3312 讓我少罵三句幹的雙系統配置術

目前敝司環境主要配置一台 windows 筆電(收信使用:P)和我自己的 Mac air,還有一台 BenQ 27吋的螢幕,Logi K855 + Logi Lift,除了 window 筆電,其他都是我自備的 純粹就是我想搭配白色系的桌面:P 最開始我是把 window 收在置物櫃,因 windows 筆電公司有鎖藍牙,所以無法透過K855 + Lift 多頻切換方式去連線,我也不想透過 usb 方式連線鍵鼠組,所以早期透過 Mac air APP 「Windows APP」遠端連線到 wi...

Oct 30, 2025

Yukki的腦洞很大

13 posts

職業婦女,前端工程師,

白天上日班(工作),晚上上晚班(家庭)

日夜笙歌。