JavaScript中this的用法及this在不同应用场景的作用解析


Posted in Javascript onApril 13, 2017

由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。

JavaScript 中函数的调用有以下几种方式:作为函数调用,作为对象方法调用,作为构造函数调用,和使用 apply 或 call 调用。下面我们将按照调用方式的不同,分别讨论 this 的含义。

情况一:纯粹的函数调用

这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。

1、函数也可以直接被调用,此时 this 绑定到全局对象。

function makeNoSense(x) { 
  this.x = x; 
} 
makeNoSense(5); 
console.log(x);// x 已经成为一个值为 5 的全局变量
function test(){
this.x = 1;

alert(this.x);
}
test(); // 1

情况二:作为对象方法的调用

函数还可以作为某个对象的方法调用,这时this指代对象内部属性被调用。

var myObject = {
value :0,

increment:function (inc){


this.value += typeof inc ==='number' ? inc:1;

}
};
myObject.increment();
console.log(myObject.value); //1
myObject.increment(2);
console.log(myObject.value); //3

情况三 :作为构造函数调用

javaScript 支持面向对象式编程,与主流的面向对象式编程语言不同,JavaScript 并没有类(class)的概念,而是使用基于原型(prototype)的继承方式。

相应的,JavaScript 中的构造函数也很特殊,如果不使用 new 调用,则和普通函数一样。作为又一项约定俗成的准则,构造函数以大写字母开头,提醒调用者使用正确的方式调用。如果调用正确,this 绑定到新创建的对象上。

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。

function Point(x, y){ 
  this.x = x; 
  this.y = y; 
 }
var p1 = new Point(3,2);
console.log(p1.x+","+p1.y);//3,2

为了表明这时this不是全局对象,我对代码做一些改变:

var x = 4;
function Point(x, y){ 
  this.x = x; 
  this.y = y; 
 }
var p1 = new Point(3,2);
console.log(p1.x+","+p1.y);//3,2

情况四: apply或call调用

让我们再一次重申,在 JavaScript 中函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。这两个方法异常强大,他们允许切换函数执行的上下文环境(context),即 this 绑定的对象。很多 JavaScript 中的技巧以及类库都用到了该方法。让我们看一个具体的例子:

function Point(x, y){ 
  this.x = x; 
  this.y = y; 
  this.moveTo = function(x, y){ 
    this.x = x; 
    this.y = y; 
    console.log(this.x+","+this.y);
  } 
} 
var p1 = new Point(0, 0); 
var p2 = {x: 0, y: 0}; 
p1.moveTo(1, 1); //1,1
p1.moveTo.apply(p2, [10, 10]);//10,10

在上面的例子中,我们使用构造函数生成了一个对象 p1,该对象同时具有 moveTo 方法;使用对象字面量创建了另一个对象 p2,我们看到使用 apply 可以将 p1 的方法应用到 p2 上,这时候 this 也被绑定到对象 p2 上。另一个方法 call 也具备同样功能,不同的是最后的参数不是作为一个数组统一传入,而是分开传入的。本文通过对JavaScript中经常容易混淆的this在四中应用场景中的使用方法进行了讲解,希望对您有所帮助,喜欢的话,请推荐一下哦。

以上所述是小编给大家介绍的JavaScript中this的用法及this在不同应用场景的作用解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
event.srcElement+表格应用
Aug 29 Javascript
javascript之AJAX框架使用说明
Apr 24 Javascript
dotopAlert 提示用户需安装播放器的代码
Sep 17 Javascript
JavaScript中的条件判断语句使用详解
Jun 03 Javascript
浅谈js的ajax的异步和同步请求的问题
Oct 07 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 Javascript
jQuery旋转插件jqueryrotate用法详解
Oct 13 Javascript
Vue.js学习笔记之修饰符详解
Jul 25 Javascript
微信小程序实现tab切换效果
Nov 21 Javascript
jQuery代码优化方法总结
Jan 29 jQuery
vue-cli 打包后提交到线上出现 "Uncaught SyntaxError:Unexpected token" 报错
Nov 06 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
vue如何引用其他组件(css和js)
Apr 13 #Javascript
JavaScript数据结构之二叉树的遍历算法示例
Apr 13 #Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
Apr 13 #jQuery
vue组件如何被其他项目引用
Apr 13 #Javascript
微信小程序开发之数据存储 参数传递 数据缓存
Apr 13 #Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
Apr 13 #jQuery
老生常谈javascript中逻辑运算符&&和||的返回值问题
Apr 13 #Javascript
You might like
PHP脚本数据库功能详解(上)
2006/10/09 PHP
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
php实现头像上传预览功能
2017/04/27 PHP
索趣科技的答案
2007/02/07 Javascript
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
详解React 条件渲染
2020/07/08 Javascript
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
Django原生sql也能使用Paginator分页的示例代码
2017/11/15 Python
Python实现按中文排序的方法示例
2018/04/25 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
Python中pip更新和三方插件安装说明
2018/07/08 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
结婚堵门保证书
2015/05/08 职场文书
房产电话营销开场白
2015/05/29 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
Python requests用法和django后台处理详解
2022/03/19 Python
Java异常体系非正常停止和分类
2022/06/14 Java/Android