实例讲解JavaScript中call、apply、bind方法的异同


Posted in Javascript onSeptember 13, 2016

以实例切入,讲解JavaScript中call,apply,bind方法,供大家参考,具体内容如下

<!DOCTYPE html>
<html>

 <head>
 <meta charset="UTF-8">
 <title></title>
 <script type="text/javascript">
  function MAN(name, sex, age) {
  this.name = name;
  this.sex = sex;
  this.age = age;
  this.say = function(school,zhuanye) {
   console.log(this.name + " , " + this.sex + " ,今年" + this.age+"岁!在"+school+"学习"+zhuanye);
  }
  }
  function WOMAN(name, sex, age) {
  this.name = name;
  this.sex = sex;
  this.age = age;
  }
  var man=new MAN("张三","男",26);
  var woman=new WOMAN("小红","女",18);
  man.say('清华大学','挖掘机');
  man.say.call(woman,"蓝翔技校","电气焊");
  man.say.apply(woman,["新东方","火星语"]);
  man.say.bind(woman)("德云社","流行音乐");
 </script>
 </head>

 <body>
 </body>

</html>

实例讲解JavaScript中call、apply、bind方法的异同

why?call,apply,bind干什么的?为什么要学这个?

一般用来指定this的环境,在没有学之前,通常会有这些问题。 

var a = {
  user:"追梦子",
  fn:function(){
    console.log(this.user);
  }
}
var b = a.fn;
b(); //undefined

我们是想打印对象a里面的user却打印出来undefined是怎么回事呢?如果我们直接执行a.fn()是可以的。 

var a = {
  user:"追梦子",
  fn:function(){
    console.log(this.user);
  }
}
a.fn(); //追梦子

这里能够打印是因为,这里的this指向的是函数a,那为什么上面的不指向a?我们如果需要了解this的指向问题,请看彻底理解js中this的指向,不必硬背这篇文章。 

虽然这种方法可以达到我们的目的,但是有时候我们不得不将这个对象保存到另外的一个变量中,那么就可以通过以下方法。 

1、call()

var a = {
  user:"追梦子",
  fn:function(){
    console.log(this.user); //追梦子
  }
}
var b = a.fn;
b.call(a);

通过在call方法,给第一个参数添加要把b添加到哪个环境中,简单来说,this就会指向那个对象。
call方法除了第一个参数以外还可以添加多个参数,如下: 

var a = {
  user:"追梦子",
  fn:function(e,ee){
    console.log(this.user); //追梦子
    console.log(e+ee); //3
  }
}
var b = a.fn;
b.call(a,1,2);

2、apply() 

apply方法和call方法有些相似,它也可以改变this的指向 

var a = {
  user:"追梦子",
  fn:function(){
    console.log(this.user); //追梦子
  }
}
var b = a.fn;
b.apply(a);

同样apply也可以有多个参数,但是不同的是,第二个参数必须是一个数组,如下: 

var a = {
  user:"追梦子",
  fn:function(e,ee){
    console.log(this.user); //追梦子
    console.log(e+ee); //11
  }
}
var b = a.fn;
b.apply(a,[10,1]);

或者 

var a = {
  user:"追梦子",
  fn:function(e,ee){
    console.log(this.user); //追梦子
    console.log(e+ee); //520
  }
}
var b = a.fn;
var arr = [500,20];
b.apply(a,arr);


//注意如果call和apply的第一个参数写的是null,那么this指向的是window对象
 
var a = {
  user:"追梦子",
  fn:function(){
    console.log(this); //Window {external: Object, chrome: Object, document: document, a: Object, speechSynthesis: SpeechSynthesis…}
  }
}
var b = a.fn;
b.apply(null);

3、bind() 

bind方法和call、apply方法有些不同,但是不管怎么说它们都可以用来改变this的指向。 

先来说说它们的不同吧。 

var a = {
  user:"追梦子",
  fn:function(){
    console.log(this.user);
  }
}
var b = a.fn;
b.bind(a);

我们发现代码没有被打印,对,这就是bind和call、apply方法的不同,实际上bind方法返回的是一个修改过后的函数。 

var a = {
  user:"追梦子",
  fn:function(){
    console.log(this.user);
  }
}
var b = a.fn;
var c = b.bind(a);
console.log(c); //function() { [native code] }

那么我们现在执行一下函数c看看,能不能打印出对象a里面的user 

var a = {
  user:"追梦子",
  fn:function(){
    console.log(this.user); //追梦子
  }
}
var b = a.fn;
var c = b.bind(a);
c();

ok,同样bind也可以有多个参数,并且参数可以执行的时候再次添加,但是要注意的是,参数是按照形参的顺序进行的。 

var a = {
  user:"追梦子",
  fn:function(e,d,f){
    console.log(this.user); //追梦子
    console.log(e,d,f); //10 1 2
  }
}
var b = a.fn;
var c = b.bind(a,10);
c(1,2);

总结:call和apply都是改变上下文中的this并立即执行这个函数,bind方法可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别,根据自己的实际情况来选择使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 字符串与数组转换函数[不用split与join]
Dec 13 Javascript
JavaScript 学习笔记(十五)
Jan 28 Javascript
jquery+json实现的搜索加分页效果
Mar 31 Javascript
基于jQuery的图片大小自动适应实现代码
Nov 17 Javascript
通过JS获取用户本地图片路径并显示的代码
Feb 16 Javascript
JavaScript实现拼音排序的方法
Nov 20 Javascript
javascript去除空格方法小结
May 21 Javascript
对JavaScript客户端应用编程的一些建议
Jun 24 Javascript
vue中渐进过渡效果实现
Oct 27 Javascript
smartupload实现文件上传时获取表单数据(推荐)
Dec 12 Javascript
Bootstrap Search Suggest使用例子
Dec 21 Javascript
vue element-ui实现动态面包屑导航
Dec 23 Javascript
JS判断浏览器是否安装flash插件的简单方法
Sep 13 #Javascript
js实现表单及时验证功能 用户信息立即验证
Sep 13 #Javascript
浅谈JQ中mouseover和mouseenter的区别
Sep 13 #Javascript
浅谈JS的基础类型与引用类型
Sep 13 #Javascript
JavaScript简单下拉菜单特效
Sep 13 #Javascript
javascript特殊文本输入框网页特效
Sep 13 #Javascript
浅谈JS之iframe中的窗口
Sep 13 #Javascript
You might like
Views rows style模板重写代码
2011/05/16 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
初识php MVC
2014/09/10 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
2014/01/02 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
学习Node.js模块机制
2016/10/17 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
利用Javascript实现简单的转盘抽奖
2017/02/13 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
layui prompt 设置允许空白提交的方法
2019/09/24 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
python友情链接检查方法
2015/07/08 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
python numpy格式化打印的实例
2018/05/14 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
jupyter 添加不同内核的操作
2021/02/06 Python
师范大学音乐表演专业求职信
2013/10/23 职场文书
市场营销专业毕业生自荐信
2013/11/02 职场文书
店长助理岗位职责
2013/12/13 职场文书
烹调加工管理制度
2014/02/04 职场文书
日化店促销方案
2014/03/26 职场文书
党员岗位承诺口号大全
2014/03/28 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技