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 相关文章推荐
JavaScript获取GridView选择的行内容
Apr 14 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
Jun 24 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
Oct 26 Javascript
javascript中错误使用var造成undefined
Mar 31 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
Apr 26 Javascript
javascript判断回文数详解及实现代码
Feb 03 Javascript
jQuery文字轮播特效
Feb 12 Javascript
vue 本地服务不能被外部IP访问的完美解决方法
Oct 29 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
Dec 19 Javascript
ES6 let和const定义变量与常量的应用实例分析
Jun 27 Javascript
vue input标签通用指令校验的实现
Nov 05 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
Dec 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
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
PHP中使用BigMap实例
2015/03/30 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
PHP 图片处理
2020/09/16 PHP
判断用户是否在线的代码
2011/03/05 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
Python使用循环神经网络解决文本分类问题的方法详解
2020/01/16 Python
Python datetime模块的使用示例
2021/02/02 Python
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
校本教研活动总结
2014/07/01 职场文书
2014年宣传工作总结
2014/11/18 职场文书
大学军训口号大全
2015/12/24 职场文书
2019军训心得体会
2019/06/27 职场文书
CSS基础详解
2021/10/16 HTML / CSS
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers
element tree树形组件回显数据问题解决
2022/08/14 Javascript