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 相关文章推荐
在JS中最常看到切最容易迷惑的语法(转)
Oct 29 Javascript
javascript获得服务器端控件的ID的实现代码
Dec 28 Javascript
在jQuery ajax中按钮button和submit的区别分析
Oct 07 Javascript
14个有用的Jquery技巧分享
Jan 08 Javascript
JS中跳出循环的示例代码
Sep 14 Javascript
JS实现的抛物线运动效果示例
Jan 30 Javascript
利用jsonp解决js读取本地json跨域的问题
Dec 11 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 Javascript
Vue动态组件与异步组件实例详解
Feb 23 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
Aug 18 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
Dec 14 Vue.js
Vue2项目中对百度地图的封装使用详解
Jun 16 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
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
python计算最小优先级队列代码分享
2013/12/18 Python
pycharm 使用心得(四)显示行号
2014/06/05 Python
python实现一次创建多级目录的方法
2015/05/15 Python
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
python 自动去除空行的实例
2018/07/24 Python
python多进程控制学习小结
2018/10/31 Python
python修改FTP服务器上的文件名
2019/09/11 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
京东奢侈品:全球奢侈品牌
2018/03/17 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
管理部部长岗位职责
2013/12/05 职场文书
挂职自我鉴定
2014/02/26 职场文书
公司外出活动方案
2014/08/14 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
2014年平安夜寄语
2014/12/08 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书