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 相关文章推荐
HTML node相关的一些资料整理
Jan 01 Javascript
javascript表单验证 - Parsley.js使用和配置
Jan 25 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
Aug 14 Javascript
js实现正方形颜色从下往上升的效果
Aug 04 Javascript
node.js中的console.trace方法使用说明
Dec 09 Javascript
JQ技术实现注册页面带有校验密码强度
Jul 27 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
Aug 16 Javascript
微信小程序实现吸顶特效
Jan 08 Javascript
javascript实现前端成语点击验证优化
Jun 24 Javascript
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
利用JS判断元素是否为数组的方法示例
Jan 08 Javascript
小程序实现文字循环滚动动画
Jun 14 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
php unset全局变量运用问题的深入解析
2013/06/17 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
Vue3为什么这么快
2020/09/23 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
python中实现定制类的特殊方法总结
2014/09/28 Python
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
用Python解决计数原理问题的方法
2016/08/04 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
Python3离线安装Requests模块问题
2019/10/13 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
中软Java笔试题
2012/11/11 面试题
网络工程师个人的自我评价范文
2013/10/01 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
无工作证明怎么写
2015/06/15 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
改造DE1103三步曲
2022/04/07 无线电