Implicit binding applies when we use a function and invoke it as a method of an object. In that
case, the this keyword points to the object on which the method was invoked. In the following
examples you will notice that the invocation of getName was done using the object person and
thats what made the this keyword point to the person object.
var person = {
firstName: 'meher',
getName: function () {
console.log(this.firstName)
},
}
person.getName() // outputs meherFunction Outside the Method
Also, it does not matter whether the function was defined within the object or not. Look at the
below example, the function's definition location doesn't matter at all. But because the function
again invoked using the person object, the this keyword understand the context and points the to
the person object.
function getName() {
console.log(this.firstName)
}
var person = {
firstName: 'meher',
getName,
}
person.getName() // outputs meherNow, you can notice that because function location doesn't matter, we can use this property to our
advantage and create a reusable function(s) that can be run on different objects and return
different result. Imagine, if we had employee object somewhere in the codebase and a person
object. Both object can reuse the firstName function.
When Implicit Binding Fails
If you store the function reference in a variable and then invoke the function later. The implicit binding is lost.
var person = {
firstName: 'meher',
getName: function () {
console.log(this.firstName)
},
}
var fn = person.getName
fn() // looks up globally?Callbacks
In the case of the callbacks, the general rule these days is that whatever is on the left side, which doesn't work . See why:
function getName() {
console.log(this.firstName)
}
var person = {
firstName: 'meher',
getName,
}
function displayFirstName(cb) {
cb()
}
displayFirstName(person.getName)Even when implicit-lost context is passed, the global issue is still raised.
function getName() {
console.log(this.firstName)
}
var person = {
firstName: 'meher',
getName,
}
setTimeout(person.getName, 1000)
// An implementation similar to this could be found in a library or native API:
function setTimeout(fn, delay) {
fn()
}