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 相关文章推荐
分享14个很酷的jQuery导航菜单插件
Apr 25 Javascript
JS定时关闭窗口的实例
May 22 Javascript
JavaScript中创建字典对象(dictionary)实例
Mar 31 Javascript
浅谈Javascript中Object与Function对象
Sep 26 Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 Javascript
模板视图和AngularJS之间冲突的解决方法
Nov 22 Javascript
浅谈jQuery hover(over, out)事件函数
Dec 03 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
Jan 03 Javascript
Javascript中parseInt的正确使用方式
Oct 17 Javascript
React中使用UMEditor的方法示例
Dec 27 Javascript
小程序实现长按保存图片的方法
Dec 31 Javascript
vue如何实现动态加载脚本
Feb 05 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
PHP4之真OO
2006/10/09 PHP
php随机输出名人名言的代码
2012/10/07 PHP
php微信开发之百度天气预报
2016/11/18 PHP
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
jQuery链使用指南
2015/01/20 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
vue ssr 指南详读
2018/06/29 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
2019/04/11 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
python try...finally...的实现方法
2020/11/25 Python
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
见习期自我鉴定范文
2014/03/19 职场文书
ktv好的活动方案
2014/08/15 职场文书
上课不认真检讨书
2014/09/17 职场文书
2014年终个人工作总结
2014/11/07 职场文书
小学教师岗位职责
2015/04/02 职场文书
电影地道战观后感
2015/06/04 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
创业计划书之养殖业
2019/10/11 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android