惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
博客园_首页
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
美团技术团队
小众软件
小众软件
Jina AI
Jina AI
S
SegmentFault 最新的问题
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Understanding call, apply and bind methods in Javascript
Jahid Hasan · 2026-05-08 · via DEV Community

Three little methods. One big idea: you control what this points to.


Every time you write a function in JavaScript, there's a hidden element — the this keyword. Usually, it works fine, but when you extract a method or pass it as an event listener, this can point somewhere unexpected, causing confusing bugs.

call, apply, and bind are the tools that help manage that hidden element. Let's explore with an example involving a bus company 🚌.


The Example Setup

Consider Purbasha Paribahan, a local bus company modeled as an object with a book method to record passenger reservations.

const purbasha = {
  busName: 'Purbasha Paribahan',
  busCode: 'PB',
  bookings: [],
  book: function(busNum, passengerName) {
    console.log(
      `${passengerName} has booked a seat on ${this.busName} with bus ${this.busCode}${busNum}.`
    );
    this.bookings.push({ bus: `${this.busCode}${busNum}`, passengerName });
  }
};

Enter fullscreen mode Exit fullscreen mode

Calling the function normally works perfectly:

purbasha.book(12, 'Sumon');

Enter fullscreen mode Exit fullscreen mode

Output: Sumon has booked a seat on Purbasha Paribahan with bus PB12.

Inside book, this refers to purbasha — exactly as intended. But things get interesting when a rival enters the scene.

A competing company, Royal Express, needs similar booking functionality. Repeating the method isn't ideal, so we introduce our three heroes.

const royal = {
  busName: 'Royal Express',
  busCode: 'RE',
  bookings: []
};

Enter fullscreen mode Exit fullscreen mode


Method 1: call — Invoke Immediately with Arguments as a List

First, get the book function separately, then use .call() to invoke it with this set to the desired object, passing arguments individually.

const book = purbasha.book; // separate function reference

book.call(royal, 45, 'Tanvir');

Enter fullscreen mode Exit fullscreen mode

Output: Tanvir has booked a seat on Royal Express with bus RE45.

What's happening?
call runs book immediately, manually setting this to royal. It's like: "Use this function but treat it as if it belongs to royal".

Argument Description
1st Object to assign this
2nd, 3rd, ... Function arguments

Method 2: apply — Same as call, Arguments in an Array

apply is similar but takes arguments as an array, useful when data is already in an array.

const passengerData = [23, 'Mahfuz'];

book.apply(purbasha, passengerData);

Enter fullscreen mode Exit fullscreen mode

Output: Mahfuz has booked a seat on Purbasha Paribahan with bus PB23.

Tip: With ES6+, you can use the spread operator with call instead:
book.call(purbasha, ...passengerData);

Method Argument Passing
call Individually listed
apply In an array

Method 3: bind — Create a New Function with this Set

bind doesn't run the function immediately. Instead, it returns a new function with this permanently set, which you can call later.

const bookRE = book.bind(royal); // new function

bookRE(56, 'Mustak'); // call the new function

Enter fullscreen mode Exit fullscreen mode

Output: Mustak has booked a seat on Royal Express with bus RE56.


Using bind for Partial Application

bind is especially useful for partial application, where you preset some arguments.

// preset `this` and bus number 56
const bookRE56 = book.bind(royal, 56);

bookRE56('Robin');
bookRE56('Rafi');

Enter fullscreen mode Exit fullscreen mode

Output:

Robin has booked a seat on Royal Express with bus RE56.
Rafi has booked a seat on Royal Express with bus RE56.

Enter fullscreen mode Exit fullscreen mode

Note: Partial application is creating specialized functions by presetting some arguments.


Common Pitfall: Event Callbacks

Using object methods as event handlers often causes this to break. Here's an example:

purbasha.buses = 100;
purbasha.buyBus = function() {
  this.buses++;
  console.log(this.buses);
};

// ❌ Wrong — don't do this
document.querySelector('.buy')
  .addEventListener('click', purbasha.buyBus);

Enter fullscreen mode Exit fullscreen mode

Click, and you'll see NaN, not 101. That's because in event callbacks, this refers to the DOM element (the button), which lacks a buses property, leading to undefined++, resulting in NaN.

Rule of thumb: When passing methods as callbacks, this can lose its original context.

To fix, bind the method:

// ✅ Correct — bind `purbasha` as 'this'
document.querySelector('.buy')
  .addEventListener('click', purbasha.buyBus.bind(purbasha));

Enter fullscreen mode Exit fullscreen mode

Now, this inside buyBus always refers to purbasha, no matter the event source.


Quick Reference

Method Executes? Argument Passing Use Case
call Yes, immediately Individual args One-off with specific this
apply Yes, immediately Arguments in array When data is in an array
bind No — returns a new func Pre-set args optional Callbacks, partials

That's it! Understanding these methods as different ways to specify "this" makes them less mysterious and more natural to use.

Questions? Comments? Feel free to ask!

*Inspired by Jonas Schmedtmann's JavaScript course on Udemy.