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 相关文章推荐
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
May 18 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
Apr 17 Javascript
jQuery选择器源码解读(三):tokenize方法
Mar 31 Javascript
微信小程序 获取设备信息 API实例详解
Oct 02 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
Jan 03 Javascript
angular.js 路由及页面传参示例
Feb 24 Javascript
jquery点赞功能实现代码 点个赞吧!
May 29 jQuery
JS对象与json字符串相互转换实现方法示例
Jun 14 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
Sep 29 Javascript
在Vue 中获取下拉框的文本及选项值操作
Aug 13 Javascript
vue实现顶部菜单栏
Nov 08 Javascript
javascript实现京东快递单号的查询效果
Nov 30 Javascript
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
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
JQuery UI DatePicker中z-index默认为1的解决办法
2010/09/28 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
Python 脚本拉取 Docker 镜像问题
2019/11/10 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
Linux面试题LINUX系统类
2015/11/25 面试题
《乌塔》教学反思
2014/02/17 职场文书
成龙洗发水广告词
2014/03/14 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书
承诺书范文
2014/06/03 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
财务统计员岗位职责
2015/04/14 职场文书
学籍证明模板
2015/06/18 职场文书
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang
聊聊CSS粘性定位sticky案例解析
2022/06/01 HTML / CSS
httpclient调用远程接口的方法
2022/08/14 Java/Android