JavaScript Development Space

How to Understand Binding Types in JavaScript: A Complete Guide

Understanding how this works in JavaScript is critical to mastering the language. JavaScript provides four primary ways to bind the this keyword within a function: default binding, implicit binding, explicit binding, and new binding. This article dives deep into each of these methods, offering clear explanations and optimized examples to improve your comprehension.

Default Binding

Default binding occurs when a function is invoked in the global context. In non-strict mode, this refers to the global object (i.e., window in browsers). In strict mode, however, this is undefined.

Example:

js
1 function showThis() {
2 console.log(this);
3 }
4
5 showThis(); // Outputs: Window (non-strict mode)
6
7 "use strict";
8 function showThisStrict() {
9 console.log(this);
10 }
11
12 showThisStrict(); // Outputs: undefined

Implicit Binding

Implicit binding happens when a function is invoked as a method of an object. In this case, this refers to the object through which the function was called.

Example:

js
1 const obj = {
2 name: 'Alice',
3 greet() {
4 console.log(this.name);
5 }
6 };
7
8 obj.greet(); // Outputs: Alice

However, if the method is assigned to a standalone variable, the implicit binding is lost, and this reverts to the default binding.

Example:

js
1 const greet = obj.greet;
2 greet(); // Outputs: undefined (strict mode) or Window (non-strict mode)

Explicit Binding

Explicit binding allows you to manually specify the value of this using call(), apply(), or bind().

  • call(): Invokes the function immediately with a specified this value.

Example:

js
1 function greet() {
2 console.log(this.name);
3 }
4
5 const user = { name: 'Bob' };
6 greet.call(user); // Outputs: Bob
  • apply(): Similar to call(), but it takes arguments as an array.

Example:

js
1 function introduce(greeting) {
2 console.log(`${greeting}, my name is ${this.name}`);
3 }
4
5 const person = { name: 'Charlie' };
6 introduce.apply(person, ['Hello']); // Outputs: Hello, my name is Charlie
  • bind(): Returns a new function with this bound to the specified object. It does not invoke the function immediately.

Example:

js
1 function sayHello() {
2 console.log(this.name);
3 }
4
5 const user1 = { name: 'David' };
6 const boundSayHello = sayHello.bind(user1);
7 boundSayHello(); // Outputs: David

New Binding

When a function is invoked as a constructor using the new keyword, this refers to the newly created object.

Example:

js
1 function Person(name) {
2 this.name = name;
3 }
4
5 const person1 = new Person('Eve');
6 console.log(person1.name); // Outputs: Eve

Here, new creates an instance of Person, and this is bound to the new object.

Summary

  • Default Binding: this refers to the global object (or undefined in strict mode).
  • Implicit Binding: this refers to the object that called the function.
  • Explicit Binding: Use call(), apply(), or bind() to specify this manually.
  • New Binding: this refers to the object created by a constructor.

Comparison of Binding Types

1. Default Binding: Refers to the global object or undefined (in strict mode).

js
1 function showThis() {
2 console.log(this);
3 }
4 showThis();

2. Implicit Binding: Refers to the calling object.

js
1 const obj = {
2 name: 'Alice',
3 greet() {
4 console.log(this.name);
5 }
6 };
7 obj.greet();

3. Explicit Binding: Manually specifies the this value.

js
1 function greet() {
2 console.log(this.name);
3 }
4 const user = { name: 'Bob' };
5 greet.call(user);

4. New Binding: Refers to the newly created object.

js
1 function Person(name) {
2 this.name = name;
3 }
4 const person1 = new Person('Eve');
5 console.log(person1.name);

Mastering this

Understanding these binding rules helps avoid common pitfalls and ensures you can write cleaner, more maintainable JavaScript code. By practicing these concepts and experimenting with real-world examples, you can confidently handle even the trickiest this scenarios in your projects.

JavaScript Development Space

© 2025 JavaScript Development Space - Master JS and NodeJS. All rights reserved.