function.call
function.call
call()
方法调用一个函数, 其具有一个指定的this
值和分别地提供的参数(参数的列表
)。
注意:
该方法的作用和 apply()
方法类似,只有一个区别,就是call()
方法接受的是若干个参数的列表
,而apply()
方法接受的是一个包含多个参数的数组
。
语法
function.call(thisArg, arg1, arg2, ...)
参数
thisArg
在fun
函数运行时指定的this
值。
需要注意的是,指定的this
值并不一定是该函数执行时真正的this
值,如果这个函数处于非严格模式下,则指定为null
和undefined
的this值会自动指向
全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this
会指向该原始值的自动包装对象。
返回值
返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined。
描述
可以让call()中的对象调用当前对象所拥有的function。你可以使用call()来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)。
示例
使用call方法调用父构造函数
在一个子构造函数中,
你可以通过调用父构造函数的 call
方法来实现继承,
类似于Java
中的写法。下例中,
使用 Food
和 Toy
构造函数创建的对象实例都会拥有在 Product
构造函数中添加的 name 属性和 price 属性,但 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';
}
var cheese = new Food('feta', 5
var fun = new Toy('robot', 40
使用call方法调用匿名函数
在下例中的for
循环体内,我们创建了一个匿名函数,然后通过调用该函数的call
方法,将每个数组元素作为指定的this值
执行了那个匿名函数。这个匿名函数的主要目的是给每个数组元素对象添加一个print
方法,这个print
方法可以打印出各元素在数组中的正确索引号。当然,这里不是必须得让数组元素作为this值
传入那个匿名函数(普通参数就可以),目的是为了演示call
的用法。
var animals = [
{ species: 'Lion', name: 'King' },
{ species: 'Whale', name: 'Fail' }
];
for (var 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方法调用函数并且指定上下文的'this'
在下面的例子中,当调用greet
方法的时候,该方法的this
值会绑定到i
对象。
function greet() {
var reply = [this.person, 'Is An Awesome', this.role].join(' '
console.log(reply
}
var i = {
person: 'Douglas Crockford', role: 'Javascript Developer'
};
greet.call(i // Douglas Crockford Is An Awesome Javascript Developer
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 1st Edition (ECMA-262) | Standard | Initial definition. Implemented in JavaScript 1.3. |
ECMAScript 5.1 (ECMA-262)The definition of 'Function.prototype.call' in that specification. | Standard | |
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Function.prototype.call' in that specification. | Standard | |
ECMAScript Latest Draft (ECMA-262)The definition of 'Function.prototype.call' in that specification. | Living Standard | |
浏览器兼容性
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |