javascript中call,apply,bind的区别详解


Posted in Javascript onDecember 11, 2020

在JS中,这三者都是用来改变函数的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.call(xh);

对于apply可以这样:

xw.say.apply(xh);

而对于bind来说需要这样:

xw.say.bind(xh)();

如果直接写xw.say.bind(xh)是不会有任何结果的,看到区别了吗?call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。
那么call和apply有什么区别呢?我们把例子稍微改写一下。

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
        }

可以看到say方法多了两个参数,我们通过call/apply的参数进行传参。
对于call来说是这样的

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

而对于apply来说是这样的

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

看到区别了吗,call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。
那么bind怎么传参呢?它可以像call那样传参。

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

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

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

以上就是javascript中call,apply,bind的区别详解的详细内容,更多关于JavaScript call,apply,bind的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
小试JQuery的AutoComplete插件
May 04 Javascript
js随机颜色代码的多种实现方式
Apr 23 Javascript
jQuery中prepend()方法用法实例
Dec 25 Javascript
jQuery获得子元素个数的方法
Apr 14 Javascript
详解JavaScript逻辑And运算符
Dec 04 Javascript
JS跨域解决方案之使用CORS实现跨域
Apr 14 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
May 18 Javascript
Javascript 正则表达式校验数字的简单实例
Nov 02 Javascript
记一次webpack3升级webpack4的踩坑经历
Jun 12 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
May 27 Javascript
Vue toFixed保留两位小数的3种方式
Oct 23 Javascript
JavaScript实现队列结构过程
Dec 06 Javascript
使用js获取身份证年龄的示例代码
Dec 11 #Javascript
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 #Vue.js
node koa2 ssr项目搭建的方法步骤
Dec 11 #Javascript
uni-app 自定义底部导航栏的实现
Dec 11 #Javascript
微信小程序实现音乐播放页面布局
Dec 11 #Javascript
JS实现可以用键盘方向键控制的动画
Dec 11 #Javascript
JS实现京东商品分类侧边栏
Dec 11 #Javascript
You might like
10个实用的PHP代码片段
2011/09/02 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
Laravel框架表单验证详解
2014/09/04 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
JS中的多态实例详解
2017/10/15 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
python进阶教程之动态类型详解
2014/08/30 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
numpy库reshape用法详解
2020/04/19 Python
俄罗斯游戏商店:Buka
2020/03/01 全球购物
提高EJB性能都有哪些技巧
2012/03/25 面试题
室内设计自我鉴定
2013/10/15 职场文书
厂长岗位职责
2014/02/19 职场文书
关于环保的活动方案
2014/08/25 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
慰问信格式
2015/02/14 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
vue 实现上传组件
2021/05/31 Vue.js