DEV Community

bright inventions
bright inventions

Posted on • Originally published at brightinventions.pl

call(), apply() and bind() Methods in JavaScript

Working with JavaScript 'this' keyword can be tricky. Not knowing the background rules may end up with the famous “it doesn’t work and I don’t know why”. It’s good to know the theory before putting things into practice. 'call()', 'apply()' and 'bind()' methods can come in handy while setting the 'this' value.

Basic Rules Worth Remembering:

  1. 'this' always refers to an object.

  2. 'this' refers to an object which calls the function it contains.

  3. In the global context 'this' refers to either window object or is undefined if the ‘strict mode’ is used.

I would like to focus on the first two rules specifically.

var car = { 
    registrationNumber: "GA12345",
    brand: "Toyota",

    displayDetails: function(){
        console.log(this.registrationNumber + " " + this.brand);
    }
}
Enter fullscreen mode Exit fullscreen mode

The above will work perfectly fine as long as we use it this way:

car.displayDetails()
Enter fullscreen mode Exit fullscreen mode

But what if we want to borrow a method?

var myCarDetails =  car.displayDetails;
myCarDetails()
Enter fullscreen mode Exit fullscreen mode

Well, this won’t work as the 'this' will be now assigned to the global context which doesn’t have neither the 'registrationNumber' nor the 'brand' property.

The 'bind()' Method

For such cases we can use the ECMAScript 5 'bind()' method of the Function.prototype property. This means 'bind()' can be used by every single function.

var myCarDetails = car.displayDetails.bind(car)
myCarDetails()
Enter fullscreen mode Exit fullscreen mode

The 'bind()' method creates a new function where 'this' refers to the parameter in the parenthesis in the above case “car”. This way the 'bind()' method enables us to call a function with a specified 'this' value.

What if we would like to pass a parameter to the displayDetails function? We can use the bind method again. The following argument of the 'bind()' method will provide an argument to the function 'bind()' is called on.

Let me rewrite the car object:

var car = { 
    registrationNumber: "GA12345",
    brand: "Toyota",

    displayDetails: function(ownerName){
        console.log(ownerName + ", this is your car: " + this.registrationNumber + " " + this.brand);
    }
}
Enter fullscreen mode Exit fullscreen mode

Example of passing arguments with 'bind()':

var myCarDetails = car.displayDetails.bind(car, "Vivian")
Enter fullscreen mode Exit fullscreen mode

'call()' and 'apply()' Methods

Similar but slightly different usage provides the 'call()' and 'apply()' methods which also belong to the Function.prototype property.

This time there is a 'car' object without the displayDetails function, which is located in the global context.

 var car = { 
            registrationNumber: "GA12345",
            brand: "Toyota"
        }

function displayDetails(ownerName){
               console.log(ownerName + ", this is your car: " + this.registrationNumber + " " + this.brand);
Enter fullscreen mode Exit fullscreen mode

We can use the 'apply()' function:

displayDetails.apply(car, ["Vivian"])
Enter fullscreen mode Exit fullscreen mode

Or

displayDetails.call(car, "Vivian")
Enter fullscreen mode Exit fullscreen mode

Note that when using the 'apply()' function the parameter must be placed in an array. 'call()' accepts an argument list. Both are great tools for borrowing functions in JavaScript.

'bind()', 'call()' and 'apply()' functions can make your life easier when you need to set the value of ‘this’.
Hope the post was helpful. Have a happy day and enjoy the coding!

Discussion (0)