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 相关文章推荐
网页防止tab键的使用快速解决方法
Nov 07 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
Nov 22 Javascript
浅谈JavaScript事件的属性列表
Mar 01 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
Sep 28 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
May 09 Javascript
jQuery正则验证注册页面经典实例
Jun 10 jQuery
详解如何使用Node.js编写命令工具——以vue-cli为例
Jun 29 Javascript
老生常谈javascript的面向对象思想
Aug 22 Javascript
详解javascript 变量提升(Hoisting)
Mar 12 Javascript
js实现移动端吸顶效果
Jan 08 Javascript
微信小程序 button样式设置为图片的方法
Jun 19 Javascript
如何利用JavaScript实现二叉搜索树
Apr 02 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
ThinkPHP关于session的操作方法汇总
2014/07/18 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)
2017/09/15 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
Django之提交表单与前后端交互的方法
2019/07/19 Python
Python秒算24点实现及原理详解
2019/07/29 Python
python tkinter控件布局项目实例
2019/11/04 Python
Linux操作面试题
2012/05/16 面试题
管理学专业个人求职信范文
2013/12/13 职场文书
大学生自我鉴定范文模板
2014/01/21 职场文书
手机银行营销方案
2014/03/14 职场文书
师德师风演讲稿
2014/05/05 职场文书
反邪教标语
2014/06/23 职场文书
导游词欢迎词
2015/02/02 职场文书
电影雷锋观后感
2015/06/10 职场文书
会议主持词结束语
2015/07/03 职场文书
执行力心得体会范文
2016/01/11 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android