张艳涛写于2020-01-25,参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call
**call()**
方法使用一个指定的 this
值和单独给出的一个或多个参数来调用一个函数
function.call(thisArg, arg1, arg2, …)
thisArg
可选的。在 function
函数运行时使用的 this
值。请注意,this
可能不是该方法看到的实际值:
如果这个函数处于非严格模式下,则指定为 null
或 undefined
时会自动替换为指向全局对象,原始值会被包装。
arg1, arg2, ...
指定的参数列表。
使用调用者提供的 this
值和参数调用该函数的返回值。若该方法没有返回值,则返回 undefined
。
call()
允许为不同的对象分配和调用属于一个对象的函数/方法。
call()
提供新的 this 值给当前调用的函数/方法。你可以使用 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';
}
console.log(new Food('cheese', 5).name);
分析如下
在来看官方的第二个例子
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);
}
for (var i = 0; i < animals.length; i++) {
console.log(animals[i])}
分析如下
call
方法调用函数并且指定上下文的 'this
'再看第三个例子,在下面的例子中,当调用 greet
方法的时候,该方法的this
值会绑定到 obj
对象。
function greet() {
var reply = [this.animal, 'typically sleep between', this.sleepDuration].join(' ');
console.log(reply);
}
var obj = {
animal: 'cats', sleepDuration: '12 and 16 hours'
};
greet.call(obj); // cats typically sleep between 12 and 16 hours
分析
**call**
方法调用函数并且不指定第一个参数(argument
)在下面的例子中,我们调用了 display
方法,但并没有传递它的第一个参数。如果没有传递第一个参数,this
的值将会被绑定为全局对象。
var sData = 'Wisen';
function display() {
console.log('sData value is %s ', this.sData);
}
display.call(); // sData value is Wisen
注意:在严格模式下,this
的值将会是 undefined
。见下文。
'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
function forEach(obj, fn) {
if (isArray(obj)) {
// Iterate over array values
for (var i = 0, l = obj.length; i < l; i++) {
fn.call(null, obj[i], i, obj);
}
} else { …}
对应
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
/*eslint func-names:0*/
Axios.prototype[method] = function(url, config) {
return this.request(utils.merge(config || {}, {
method: method,
url: url
}));
};
});
解析
手机扫一扫
移动阅读更方便
你可能感兴趣的文章