I\'m interested what\'s the reason to have call() method in JS. It seems it duplicates usual method of calling this
.
For example, I have a code with cal
call
is used when you want to control the scope that will be used in the function called. You might want the this
keyword to be something else than the scope you assigned the function to, in those cases you can use call
or apply
to call the function with your own scope.
F.ex, it also allows you to call utility methods outside the scope, like when using "private" functions:
var obj = (function() {
var privateFn = function() {
alert(this.id);
}
return {
id: 123,
publicFn: function() {
privateFn.call(this);
}
};
}());
obj.publicFn();
In the example above, privateFn
is not exposed in obj
but it can still be constructed as if it was a part of the public scope (using this
in the same way).
2017 Update
All functions by way of Function.prototype have the .call
method. The reason to use .call()
is to specify what the variable "this
" refers to.
MDN specifies:
The
call()
method calls a function with a given this value and arguments provided individually.
Consider the following:
function x() {
return this;
}
x()
In strict mode x()
returns undefined
in non strict mode it returns the Global object, Window
in a browser context.
Example with .call()
we tell it what "this
" refers to:
function x() {
return this;
}
var obj = {
myName : 'Robert',
myLocation : 'Earth'
}
x.call(obj);
Result: {myName: "Robert", myLocation: "Earth"}
. In the above example we are specifying the obj
object as the value of this
inside the function x()
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;
}
};
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",
}
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 ) );
Output: This is me Richard Sash 25 6,4 male
You would probably use the second way in your example, but sometimes you want to use one object's functions on another object. An example would be using Array
methods on Array-like objects like NodeList
s
var el = document.getElementById("foo");
[].forEach.call(el.children, function(child, index) {
//Iterate over an element's children, performing an action on each one
});
It's to do with the concept of a first class function. Basically languages like Javascript allow you to treat functions as things their own right. Functions can be stored in variables or passed to other functions.
call()
provides a way to execute a free standing function not attached to any other object.