JavaScript 中 call 和 apply 的区别与应用
本文介绍 JavaScript 中 call 和 apply 方法的核心用法,重点解析两者在参数传递方式上的区别。通过类继承和回调函数两个典型场景,展示如何利用这两个方法改变函数执行上下文,实现属性复用和 this 指向控制。
call 和 apply 的基本区别
简单来说,这两个方法的主要作用是改变函数执行时的上下文环境,这是它们最基础的功能。两者之间的核心区别在于传递参数的形式不同。
call 方法的语法为 call(obj, arg1, arg2, arg3),其中第一个参数传入目标对象,该值也可以是 null。后续参数以逗号分隔进行传递,且参数类型可以是任意类型。
apply 方法的语法为 apply(obj, [arg1, arg2, arg3]),同样第一个参数传入目标对象。与 call 不同,apply 的第二个参数必须是一个数组或者 arguments 对象。
这两个方法通常应用于类的继承实现以及回调函数的处理中。
作用一、类的继承:
在类继承中的应用
首先来看一个具体的示例。
代码如下:
function Person(name,age){
this.name = name;
this.age=age;
this.alertName = function(){
alert(this.name);
}
this.alertAge = function(){
alert(this.age);
}
}
function webDever(name,age,sex){
Person.call(this,name,age);
this.sex=sex;
this.alertSex = function(){
alert(this.sex);
}
}
var test= new webDever("愚人码头",28,"男");
test.alertName();//愚人码头
test.alertAge();//28
test.alertSex();//男 这样 webDever类就继承Person类,Person.call(this,name,age) 的意思就是使用 Person构造函数(也是函数)在this对象下执行,那么 webDever就有了Person的所有属性和方法,test对象就能够直接调用Person的方法以及属性了; 09年的理解解非常粗浅,呵呵。
作用二、回调函数:
在回调函数中的应用
call 和 apply 在回调函数中也十分有用。在开发过程中,我们经常需要改变回调函数的执行上下文,例如在 Ajax 请求或定时器操作中。通常情况下,Ajax 是全局的,即运行在 window 对象下。以下是一个示例:
代码如下:
function Album(id, title, owner_id) {
this.id = id;
this.name = title;
this.owner_id = owner_id;
};
Album.prototype.get_owner = function (callback) {
var self = this;
$.get('/owners/' + this.owner_id, function (data) {
callback && callback.call(self, data.name);
});
};
var album = new Album(1, '生活', 2);
album.get_owner(function (owner) {
alert('The album' + this.name + ' belongs to ' + owner);
}); 在此处,
代码如下:
album.get_owner(function (owner) {
alert('The album' + this.name + ' belongs to ' + owner);
}); 代码中的 this.name 可以直接获取到 album 对象中的 name 属性。
JS大数值转字符串出现科学计数法怎么办
2026-11-05 17:09:21
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
