Javascript中的this,bind和that使用实例


Posted in Javascript onDecember 05, 2019

这篇文章主要介绍了Javascript中的this,bind和that使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Javascript中必须通过this来访问类成员,可是this的特点就是函数绑在哪个对象上,它就指向那个对象。这个可能困扰过很多的程序员,特别是从C#,Java等语言过来的程序员。

function Foo(){
  this.message = 'This is message from Foo';
}

Foo.prototype.printMessage = function(){
  console.log(this.message);
}

function Foo2(){
  this.message = 'This is message from Foo2';
}

var foo = new Foo();
foo.printMessage();

var foo2 = new Foo2();
foo2.printMessage = foo.printMessage;
foo2.printMessage();

输出为:

This is message from Foo

This is message from Foo2

主要原因就是this改变了,因此Javascript中this的用法,和C++\C#中的大为不同。如果需要传统方式使用this的函数,可以使用Function.prototype.bind(),指定函数的this值:

function Foo(){
  this.message = 'This is message from Foo';
  
  this.printMessage = (function(){
    console.log(this.message);
  }).bind(this);
}

function Foo2(){
  this.message = 'This is message from Foo2';
}

var foo = new Foo();
foo.printMessage();

var foo2 = new Foo2();
foo2.printMessage = foo.printMessage;
foo2.printMessage();

输出为:

This is message from Foo

This is message from Foo

另外使用call和apply也可以改变函数调用时的this值。

bind函数的主要问题是IE9以后才开始提供。并且一旦开始习惯了Javascript的this用法,这种bind反而会不习惯。在实践中,更多用到的还是保存this:

function Foo(){
  var that = this;
  
  this.message = 'This is message from Foo';
  
  this.printMessage = function(){
    console.log(that.message);
  };
}

function Foo2(){
  this.message = 'This is message from Foo2';
}

var foo = new Foo();
foo.printMessage();

var foo2 = new Foo2();
foo2.printMessage = foo.printMessage;
foo2.printMessage();

输出同上。

注意我们是通过that来访问的message(除了that,context和self也是常用的名称)。Javascript一个还算欣慰的地方就是他的闭包上下文始终是在函数定义的地方,因此不管函数被挂上哪个对象上,捕获到的that始终是这个。当然这个地方不算闭包,有闭无包,但原理是相同的。这也是实践中用的最多的方法,推荐使用。

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

Javascript 相关文章推荐
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
Feb 25 Javascript
修复IE9&safari 的sort方法
Oct 21 Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 Javascript
使用原生JS实现弹出层特效
Dec 22 Javascript
基于jquery实现表格无刷新分页
Jan 07 Javascript
ECMAScript6快速入手攻略
Jul 18 Javascript
JS与jQuery实现隔行变色的方法
Sep 09 Javascript
vue + socket.io实现一个简易聊天室示例代码
Mar 06 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
Jul 14 Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
详解Angular Forms中自定义ngModel绑定值的方式
Dec 10 Javascript
vue双向绑定及观察者模式详解
Mar 19 Javascript
原生JS与CSS实现软件卸载对话框功能
Dec 05 #Javascript
Vue快速实现通用表单验证功能
Dec 05 #Javascript
Vue组件通信中非父子组件传值知识点总结
Dec 05 #Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 #Javascript
微信小程序登录时如何获取input框中的内容
Dec 04 #Javascript
微信小程序日历插件代码实例
Dec 04 #Javascript
微信小程序request请求封装,验签代码实例
Dec 04 #Javascript
You might like
基于flush()不能按顺序输出时的解决办法
2013/06/29 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
收集前端面试题之url、href、src
2018/03/22 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
Python使用minidom读写xml的方法
2015/06/03 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
python实现石头剪刀布程序
2021/01/20 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
python交易记录整合交易类详解
2019/07/03 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
四种会话跟踪技术
2015/05/20 面试题
医药营销个人求职信范文
2014/02/07 职场文书
企业党员公开承诺书
2014/03/26 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
死者家属慰问信
2015/03/24 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python