JavaScript中call、apply与bind方法的用法与区别详解

作者:函数茶馆

时间:2026-10-29

浏览:632

本文详细解析JavaScript中call、apply和bind三个函数的用法及核心区别。三者均用于改变函数执行时的this指向,但call和apply为直接调用,区别在于参数传递形式(列表vs数组);bind则返回新函数,支持预绑定参数与运行时传参。通过实例演示帮助开发者准确掌握各方法的使用场景。

文章目录

call与apply的基本用法

call(thisObj,arg1,arg2...)与apply(thisObj,[obj1,obj2...])是JavaScript中每个函数对象都具备的非继承内置方法。

call(thisobj[, args])和apply(thisobj[, args])

两者的核心作用一致,即改变当前方法执行时this的指向,使其指向调用者指定的thisObj对象。主要区别在于参数传递方式:call方法要求后续参数逐个列出,而apply方法要求后续参数以数组形式传入。

通过具体示例进行说明更为直观:


window.color='red';
var o={color:"blue"};
function sayColor(){
alert(this.color);
};
sayColor(); //red(全局函数,this是window)
sayColor.call(this);//red(调用call方法,指定对象是this,这里的this是window,没什么意义)
sayColor.call(window);//red(调用call方法,指定对象是window,没什么意义)
sayColor.call(o); //blue (调用call方法,指定对象是o,所以this指代对象o,这里由原来的window指向了o)
sayColor.apply(o);//blue (调用call方法,指定对象是o,所以this指代对象o,这里由原来的window指向了o)

bind方法的特性

在ECMAScript5标准中,bind()方法与前两者功能相似,但它会创建并返回一个新的函数实例。该新函数的this值被永久绑定到传递给bind()的第一个参数上。

示例:


function a(y){
return this.x+y;
};
var o={x:1};
var g=a.bind(o);
g(2);//3

从示例可见,函数a被绑定至对象o,并返回了新函数g。调用g时,原函数a将作为对象o的方法来执行。bind()方法的作用是将函数绑定到特定对象,并返回一个已绑定上下文的新函数,该新函数接收的参数将传递给被绑定的原始函数。

三者区别与参数传递对比

下面对比分析三者的具体区别。

在JavaScript中,这三者均用于改变函数内部this对象的指向。在探讨区别前,先总结它们的共同点: 1、均用于改变函数的this对象指向。 2、第一个参数均为this需要指向的目标对象。 3、均可利用后续参数进行传参。 接下来通过示例查看具体区别: var xw = { name : "小王", gender : "男", age : 24, say : function() { alert(this.name + " , " + this.gender + " ,今年" + this.age); } } var xh = { name : "小红", gender : "女", age : 18 } xw.say(); 上述代码运行结果显而易见,输出内容为“小王 , 男 ,今年24”。

那么,如何借用xw的say方法来显示xh的数据呢?

使用call方法可以实现:

xw.say.bind(xh)("实验小学","六年级");

代码如下:

xw.say.call(xh);

使用apply方法可以实现:

以上所述即为本文的全部内容,希望对大家有所帮助。

代码如下:

xw.say.apply(xh);

而使用bind方法则需要这样操作:

代码如下:

xw.say.bind(xh)();

如果仅写xw.say.bind(xh)不会有任何输出结果,这便是区别所在:call和apply是对函数的直接调用,而bind方法返回的依然是一个函数,因此必须加上括号()进行调用才能执行。


        var xw = {
            name : "小王",
            gender : "男",
            age : 24,
            say : function(school,grade) {
                alert(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);                
            }
        }
        var xh = {
            name : "小红",
            gender : "女",
            age : 18
        }

那么call和apply之间有何区别呢?我们将示例稍作改写。

可以看到say方法增加了两个参数,我们通过call或apply的参数进行传递。

对于call来说是这样的

代码如下:

xw.say.call(xh,"实验小学","六年级");

而对于apply来说是这样的

区别在于:call 的参数与 say 方法中的参数一一对应;apply 的第二个参数是数组,数组元素与 say 方法参数一一对应。bind 可像 call 那样传参。

xw.say.apply(xh,["实验小学","六年级郑州牛皮癣医院"]);

区别在于:call后面的参数与say方法中的参数是一一对应的;而apply的第二个参数是一个数组,数组中的元素与say方法中的参数一一对应。这是两者最大的区别。
那么bind如何传参呢?它可以像call那样传参。

代码如下:

xw.say.bind(xh,"实验小学","六年级")();

但由于bind返回的仍然是一个函数,我们也可以在调用时再进行传参。

代码如下:

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章