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 相关文章推荐
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
Mar 26 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
Aug 01 Javascript
深入浅析JavaScript中的3DES
Aug 24 Javascript
js实现二级导航功能
Mar 03 Javascript
js前端实现图片懒加载(lazyload)的两种方式
Apr 24 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
Sep 11 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
Nov 15 Javascript
Vue 自定义动态组件实例详解
Mar 28 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
Sep 12 Javascript
详解js访问对象的属性和方法
Oct 25 Javascript
layui+jquery支持IE8的表格分页方法
Sep 28 jQuery
原生JS中应该禁止出现的写法
May 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
PHP实现Socket服务器的代码
2008/04/03 PHP
php的字符串用法小结
2010/06/08 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
关于微信小程序登录的那些事
2019/01/08 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
python中使用mysql数据库详细介绍
2015/03/27 Python
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
在python中求分布函数相关的包实例
2020/04/15 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
四年级语文教学反思
2016/03/03 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
Python加密与解密模块hashlib与hmac
2022/06/05 Python