DEV Community

Hamza
Hamza

Posted on

Javascript Bind, Apply and Call Concepts

BIND

  • Introduction

The bind() method creates a new function that, when called, has its this keyword set to the provided value .

The syntax is given as :

bind(thisArg)
bind(thisArg, arg1)
bind(thisArg, arg1, arg2)
bind(thisArg, arg1, arg2, /* …, */ argN)
Enter fullscreen mode Exit fullscreen mode

In this syntax, the bind() method returns a copy of the function fn with the specific this value (thisArg) and arguments (arg1, arg2, …).

Unlike the call() and apply() methods, the bind() method doesn’t immediately execute the function. It just returns a new version of the function whose this sets to thisArg argument.

thisArg ⇒ The value to be passed as the this parameter to the target function func when the bound function is called.

arg1, …, argN ⇒ Arguments to prepend to arguments provided to the bound function when invoking func.

  • Use Bind for function binding

When you pass a method of an object to another function as a callback, the this is lost. For example:

let person = {
  name: "John Doe",
  getName: function () {
    console.log(this.name);
  }
};


function someFunc(obj){
obj();

}

someFunc(person.getName); 
Enter fullscreen mode Exit fullscreen mode

This will result in

passing as a callback error

As you can see clearly from the output, the person.getName() returns undefined instead of 'John Doe'.

this is because :

When a callback is executed within a higher-order function, it gets assigned a this property that is completely dependent on how it is invoked and not where/how/when it was defined.

In the example above, we have a function called someFunc(higher-order function), and it takes in a callback function that logs this.name value to the console but it now points to the global object because it is invoked in a global scope .

This issue can be resolved with bind :

let person = {
  name: "John Doe",
  getName: function () {
    console.log(this.name);
  }
};
let f = person.getName.bind(person);


function someFunc(obj){
obj();

}

someFunc(f); 
Enter fullscreen mode Exit fullscreen mode

This will result in correct output :

Bind_successful output

APPLY

The apply() method calls the specified function with a given this value, and arguments provided as an array (or an array-like object).

  • Syntax
apply(thisArg)
apply(thisArg, argsArray)
Enter fullscreen mode Exit fullscreen mode

thisArg is the value you give when you call the function .

argsArray (optional) an array-like object, specifying the arguments

  • Use of Apply

You can add an element to an array by using Array.prototype.push(). You can push a number of elements at once because push() accepts a variable number of arguments. However, if you supply an array to push(), it will actually add the entire array as a single element rather than each element separately, creating an array inside of an array.

const array = ["a", "b"];

array.push([0,1,2]);

console.log(array)
Enter fullscreen mode Exit fullscreen mode

This will give the output as

Array push with array as a param

Apply can be used in this situation to implicitly "spread" an array as a set of arguments.

const array = ["a", "b"];
const elements = [0, 1, 2];
array.push.apply(array, elements);
console.info(array); // ["a", "b", 0, 1, 2]
Enter fullscreen mode Exit fullscreen mode

This will result in :

Apply method result

This is because the argsArray parameter of apply method is an array-like object and it supplies each element in the elements array individually .

  • Another example is :
const numbers = [5, 6, 2, 3, 7];

let max = Math.max.apply(null, numbers);

// This about equal to Math.max(numbers[0], …)
// or Math.max(5, 6, …)

Enter fullscreen mode Exit fullscreen mode

This will result in

Image description

CALL

  • Introduction

The call() method calls the function with a given this value and arguments provided individually.

  • Syntax
call()
call(thisArg)
call(thisArg, arg1, /* …, */ argN)
Enter fullscreen mode Exit fullscreen mode

The call method initialises the this inside the function and launches it right away.

In contrast to bind(), which produces a copy of the function and sets the this keyword, call() sets the this keyword, executes the function instantly, and does not create a new copy of the function.

function student() {
  console.log(`Hi, I am ${this.name} and I am ${this.subject} student`);
}
const asad = {
  name: 'Asad',
  subject: "Data Science",
};
const jane = {
  name: 'Jane',
  subject: "Computer Engineering",
};
// Hi, I am Asad and I am Data Science student
student.call(asad);
// Hi, I am Jane and I am Computer Engineering student
student.call(jane);
Enter fullscreen mode Exit fullscreen mode

call() expects all parameters to be passed in individually, whereas apply() expects an array of all of our parameters.

  • Use Case of Call

It can be used to emulate inheritance in OOP.

Example

var Robert = {
    name: "Robert Rocha",
    age: 12,
    height: "5,1",
    sex: "male",
    describe: function() {
        return "This is me " + this.name + " " + this.age + " " + this.height + " " + this.sex;
    }
};
Enter fullscreen mode Exit fullscreen mode

Lets say that the above is a master object(prototype) and you want to inherit the function describe in another object:

var Richard = {
    name: "Richard Sash",
    age: 25,
    height: "6,4",
    sex: "male",
}
Enter fullscreen mode Exit fullscreen mode

The Richard object does not have the describe function and you want to simply inherit ,so to speak, the function. You would do it like so:

console.log( Robert.describe.call( Richard ) );
Enter fullscreen mode Exit fullscreen mode

Output:

This is me Richard Sash 25 6,4 male
Enter fullscreen mode Exit fullscreen mode

Top comments (0)