call()
method calls a function with a given
this
value and arguments provided individually.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
func.call([thisArg[, arg1, arg2, ...argN]])
thisArg
可选
The value to use as
this
when calling
func
.
Caution:
In certain cases,
thisArg
may not be the actual value seen by the method.
If the method is a function in
non-strict mode
,
null
and
undefined
will be replaced with the global object, and primitive values will be converted to objects.
arg1
,
arg2
, ...
argN
可选
Arguments for the function.
The result of calling the function with the specified
this
value and arguments.
call()
allows for a function/method belonging to one object to be assigned and called for a different object.
call()
provides a new value of
this
to the function/method. With
call()
, you can write a method once and then inherit it in another object, without having to rewrite the method for the new object.
注意:
While the syntax of this function is almost identical to that of
apply()
, the fundamental difference is that
call()
accepts an
argument list
,而
apply()
accepts a
single array of arguments
.
call
to chain constructors for an object
可以使用
call
to chain constructors for an object (similar to Java).
In the following example, the constructor for the
Product
object is defined with two parameters:
name
and
price
.
Two other functions,
Food
and
Toy
, invoke
Product
, passing
this
,
name
,和
price
.
Product
initializes the properties
name
and
price
, both specialized functions define the
category
.
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
function Toy(name, price) {
Product.call(this, name, price);
this.category = 'toy';
}
const cheese = new Food('feta', 5);
const fun = new Toy('robot', 40);
call
to invoke an anonymous function
In this example, we create an anonymous function and use
call
to invoke it on every object in an array.
The main purpose of the anonymous function here is to add a
print
function to every object, which is able to print the correct index of the object in the array.
Passing the object as
this
value is not strictly necessary, but is done for explanatory purpose.
const animals = [
{ species: 'Lion', name: 'King' },
{ species: 'Whale', name: 'Fail' }
];
for (let i = 0; i < animals.length; i++) {
(function(i) {
this.print = function() {
console.log('#' + i + ' ' + this.species
+ ': ' + this.name);
}
this.print();
}).call(animals[i], i);
}
call
to invoke a function and specifying the context for '
this
'
In the example below, when we call
greet
, the value of
this
will be bound to object
obj
.
function greet() {
const reply = [this.animal, 'typically sleep between', this.sleepDuration].join(' ');
console.log(reply);
}
const obj = {
animal: 'cats', sleepDuration: '12 and 16 hours'
};
greet.call(obj); // cats typically sleep between 12 and 16 hours
call
to invoke a function and without specifying the first argument
In the example below, we invoke the
display
function without passing the first argument. If the first argument is not passed, the value of
this
is bound to the global object.
var sData = 'Wisen';
function display() {
console.log('sData value is %s ', this.sData);
}
display.call(); // sData value is Wisen
Caution:
In strict mode, the value of
this
will be
undefined
. See below.
'use strict';
var sData = 'Wisen';
function display() {
console.log('sData value is %s ', this.sData);
}
display.call(); // Cannot read the property of 'sData' of undefined
| 规范 |
|---|
|
ECMAScript (ECMA-262)
The definition of 'Function.prototype.call' in that specification. |
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
call
|
Chrome 1 | Edge 12 | Firefox 1 | IE 5.5 | Opera 4 | Safari 1 | WebView Android 1 | Chrome Android 18 | Firefox Android 4 | Opera Android 10.1 | Safari iOS 1 | Samsung Internet Android 1.0 | nodejs Yes |
完整支持
Function
Function.prototype.apply()
Function.prototype.bind()
Function.prototype.call()
Function.prototype.toSource()
Function.prototype.toString()
Object
Object.prototype.__defineGetter__()
Object.prototype.__defineSetter__()
Object.prototype.__lookupGetter__()
Object.prototype.__lookupSetter__()
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
Object.prototype.propertyIsEnumerable()
Object.prototype.toLocaleString()
Object.prototype.toSource()
Object.prototype.toString()
Object.prototype.valueOf()
Object.setPrototypeOf()