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 相关文章推荐
用 JSON 处理缓存
Apr 27 Javascript
JavaScript 常用函数
Dec 30 Javascript
jQuery EasyUI API 中文文档 - Panel面板
Sep 30 Javascript
node.js中的fs.fsyncSync方法使用说明
Dec 15 Javascript
js实现星星打分效果的方法
Jul 05 Javascript
Node.js重新刷新session过期时间的方法
Feb 04 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
Apr 23 Javascript
Easyui和zTree两种方式分别实现树形下拉框
Aug 04 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
Sep 21 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
Oct 11 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
Oct 31 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
Nov 29 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
星际争霸中的对战模式介绍
2020/03/04 星际争霸
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
python使用Berkeley DB数据库实例
2014/09/26 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
python如何为创建大量实例节省内存
2018/03/20 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
python实现定时发送qq消息
2019/01/18 Python
如何在python中写hive脚本
2019/11/08 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
2016年三八节红领巾广播稿
2015/12/17 职场文书
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript