实例讲解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 相关文章推荐
js chrome浏览器判断代码
Mar 28 Javascript
javascript代码编写需要注意的7个小细节小结
Sep 21 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
Apr 03 Javascript
js实现缓冲运动效果的方法
Apr 10 Javascript
jQuery使用ajax跨域获取数据的简单实例
May 18 Javascript
实例解析jQuery中proxy()函数的用法
May 24 Javascript
JS实现数组按升序及降序排列的方法
Apr 26 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
May 03 Javascript
微信小程序实现简单input正则表达式验证功能示例
Nov 30 Javascript
JS实现图片拖拽交换效果
Nov 30 Javascript
pm2启动ssr失败的解决方法
Jun 29 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
Jul 09 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
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
python频繁写入文件时提速的方法
2019/06/26 Python
python基于递归解决背包问题详解
2019/07/03 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
Python通过socketserver处理多个链接
2020/03/18 Python
django迁移文件migrations的实现
2020/03/31 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
python logging模块的使用
2020/09/07 Python
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
部队领导证婚词
2014/01/12 职场文书
简单的辞职信范文
2014/01/18 职场文书
优秀教师先进事迹
2014/01/22 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python
Golang bufio详细讲解
2022/04/21 Golang