javascript中apply、call和bind的使用区别


Posted in Javascript onApril 05, 2016

在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可以这样:

1.xw.say.call(xh);

对于apply可以这样:

1.xw.say.apply(xh);

而对于bind来说需要这样:

1.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来说是这样的

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

而对于apply来说是这样的

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

看到区别了吗,call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。

那么bind怎么传参呢?它可以像call那样传参。

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

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

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

以上这篇javascript中apply、call和bind的使用区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
TinyMCE 新增本地图片上传功能
Nov 05 Javascript
javascript自动生成包含数字与字符的随机字符串
Feb 09 Javascript
基于jquery实现人物头像跟随鼠标转动
Aug 23 Javascript
javascript中的altKey 和 Event属性大全
Nov 06 Javascript
深入理解JavaScript中Ajax
Aug 02 Javascript
vue子父组件通信的实现代码
Jul 09 Javascript
node.js调用C++函数的方法示例
Sep 21 Javascript
JavaScript模板引擎实现原理实例详解
Dec 14 Javascript
JS实现打砖块游戏
Feb 14 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
Mar 12 Javascript
JavaScript ES 模块的使用
Nov 12 Javascript
浅析vue中的nextTick
Dec 28 Vue.js
JavaScript数组去重的两种方法推荐
Apr 05 #Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 #Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 #Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 #Javascript
javascript HTML5 canvas实现打砖块游戏
Jun 18 #Javascript
jQuery EasyUI中DataGird动态生成列的方法
Apr 05 #Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
Apr 05 #Javascript
You might like
php下通过伪造http头破解防盗链的代码
2010/07/03 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
枚举JavaScript对象的函数
2006/12/22 Javascript
JavaScript Date对象 日期获取函数
2010/12/19 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
Python配置mysql的教程(推荐)
2017/10/13 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
python实现事件驱动
2018/11/21 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
python实现广度优先搜索过程解析
2019/10/19 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
两道JAVA笔试题
2016/09/14 面试题
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
单位人事专员介绍信
2014/01/11 职场文书
个人工作主要事迹
2014/05/08 职场文书
比赛主持人开场白
2015/05/29 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
MySQL REVOKE实现删除用户权限
2021/06/18 MySQL