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关闭本窗口技巧小结
Sep 05 Javascript
jquery实现两个图片渐变切换效果的方法
Jun 25 Javascript
js确认框confirm()用法实例详解
Jan 07 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
使用JQuery选择HTML遍历函数的方法
Sep 17 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
iview给radio按钮组件加点击事件的实例
Sep 30 Javascript
javascript中关于类型判断的一些疑惑小结
Oct 14 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
vue渲染方式render和template的区别
Jun 05 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 jQuery
vue自定义组件实现双向绑定
Jan 13 Vue.js
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
preg_match_all使用心得分享
2014/01/31 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
php+ajax实现的点击浏览量加1
2015/04/16 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
详解Vue快速零配置的打包工具——parcel
2018/01/16 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
500行python代码实现飞机大战
2020/04/24 Python
深入理解Python 多线程
2020/06/16 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
Python jieba库分词模式实例用法
2021/01/13 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
String这个类型的class为何定义成final?
2012/11/13 面试题
建筑总经理岗位职责
2014/02/02 职场文书
品德评语大全
2014/05/05 职场文书
统计专业自荐书
2014/07/06 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
联村联户简报
2015/07/21 职场文书
python引入其他文件夹下的py文件具体方法
2021/05/23 Python
pandas进行数据输入和输出的方法详解
2022/03/23 Python
Go语言 详解net的tcp服务
2022/04/14 Golang
详解flex:1什么意思
2022/07/23 HTML / CSS
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技