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 相关文章推荐
双击滚屏-常用推荐
Nov 29 Javascript
改版了网上的一个js操作userdata
Apr 27 Javascript
actionscript与javascript的区别
May 25 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
Aug 27 Javascript
浅谈javascript原型链与继承
Jul 13 Javascript
js实现文本框输入文字个数限制代码
Dec 25 Javascript
微信JS接口大全
Aug 25 Javascript
Javascript基础回顾之(二) js作用域
Jan 31 Javascript
JS获取填报扩展单元格控件的值的解决办法
Jul 14 Javascript
webpack本地开发环境无法用IP访问的解决方法
Mar 20 Javascript
vue实现信息管理系统
May 30 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
Aug 07 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 事件机制(2)
2011/03/23 PHP
php处理斐波那契数列非递归方法
2012/02/04 PHP
php中设置index.php文件为只读的方法
2013/02/06 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
JavaScript 动态生成方法的例子
2009/07/22 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
vue-cli创建的项目,配置多页面的实现方法
2018/03/15 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
python之Socket网络编程详解
2016/09/29 Python
python与C互相调用的方法详解
2017/07/14 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
python提取log文件内容并画出图表
2019/07/08 Python
Django REST framework内置路由用法
2019/07/26 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
基于Python实现天天酷跑功能
2021/01/06 Python
美国玩具公司:U.S.Toy
2018/05/19 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
常见的软件开发流程有哪些
2015/11/14 面试题
实习护士自我鉴定
2013/10/13 职场文书
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
春节联欢会主持词
2014/03/24 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
党支部评议意见
2015/06/02 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis