JS中的apply和call函数的作用与区别

定义

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()的区别_想你有幸的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值