定义
apply()与call() 是JavaScript中间接调用函数的一种方法。JavaScript函数是一种对象,与其他JS对象一样,JS函数也有方法,apply()与call()就是其中的两种方法,用于间接调用函数。这两个方法允许我们指定调用时的this值,这表明可以将任意函数作为任意对象的方法进行调用,就像这个函数是某个其他对象的方法一样。
apply()与call()的第一个参数都是要调用这个函数的对象,也就是函数的调用上下文,在函数体里会变成this关键字的值。
语法
call()
调用一个对象的方法,用另一个对象替换当前对象,可以继承另外一个对象的属性,它的语法是:
Function.call(obj[, param1[, param2[, [,...paramN]]]]);
obj:这个对象将代替Function类里this对象
params:一串参数列表
说明:call方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为obj指定的新对象,如果没有提供obj参数,那么Global对象被用于obj。
apply()
和call()方法一样,只是参数列表不同,语法:
Function.apply(obj[, argArray]);
obj:这个对象将代替Function类里this对象
argArray:这个是数组,它将作为参数传给Function
说明:如果argArray不是一个有效数组或不是arguments对象,那么将导致一个TypeError,如果没有提供argArray和obj任何一个参数,那么Global对象将用作obj。
举例
function People(name, age) {
this.name = name;
this.age = age;
}
function Student(name, age, grade) {
People.call(this, name, age);
this.grade = grade;
}
var student = new Student('小明', 21, '大三');
console.log(student.name + student.age + student.grade);//小明21大三
为什么add.call(sub, 2, 1)
的执行结果是3
呢,因为call()
方法改变了this
的指向,使得sub
可以调用add
的方法,也就是用sub
去执行add
中的内容,再来看一个例子:
function People(name, age) {
this.name = name;
this.age = age;
}
function Student(name, age, grade) {
People.call(this, name, age);
this.grade = grade;
}
var student = new Student('小明', 21, '大三');
console.log(student.name + student.age + student.grade);//小明21大三
在这个例子中,我们并没有给Student的name和age赋值,但是存在这两个属性的值,这还是要归功于call()方法,它可以改变this的指向。
在这个例子里,People.call(this, name, age);中的this代表的是Student,这也就是之前说的,使得Student可以调用People中的方法,因为People中有this.name = name;等语句,这样就将name和age属性创建到了Student中。
总结一句话就是call()
可以让括号里的对象来继承括号外函数的属性。
至于apply()
方法作用也和call()
方法一样,可以这么写:
People.apply(this, [name, age]);
或者这么写:
People.apply(this, arguments);
在这里arguments
和[name, age]
是等价的。
相同与不同点
相同:call()
和apply()
方法的相同点就是这两个方法的作用是一样的。都是在特定的作用域(作用域在这篇文章中有介绍)中调用函数,等于设置函数体内this
对象的值,以扩充函数赖以运行的作用域。
不同:从定义中也可以看出来,call()
和apply()
的不同点就是接收参数的方式不同。apply()参数数组,call()函数列表。
参考文章:call()和apply()方法的区别和详细用法_call()和apply()的区别_想你有幸的博客-优快云博客