在JavaScript中,this不是固定不变的,它的指向取决于上下文环境,一般的,认为this指向使用它时所在的对象。主要有以下几类指向:

  • 在方法中,this 表示该方法所属的对象。
  • 如果单独使用,this 表示全局对象。
  • 在函数中,this 表示全局对象。
  • 在函数中,在严格模式下,this 是未定义的(undefined)。
  • 在事件中,this 表示接收事件的元素。
  • 类似 call() 和 apply() 方法可以将 this 引用到任何对象。

一、方法中的this

var isObject = {
a: 'inner object',
innerFunction: function() {
return this.a;
}
}
console.log('方法里的this指向:', isObject.innerFunction());
//输出结果:方法里的this指向: inner object

由上面代码可以看出,因为对象调用了其内部方法innerFunction(),所以此时this指向使用它时所在的对象,即isObject对象。

如果我们此时在innerFunction()函数里return this,此时控制台打印出Object {a: "inner object", innerFunction: },表示this正好指向isObject对象。

二、单独使用this

var x = this;
console.log("this指向:", x);
//输出结果:this指向: Window {postMessage: , blur: , focus: , close: , parent: Window, …}

可以看出,当单独使用this时,this指向window对象

三、函数中使用this

var variable = 'test';

 function outerFunction() {
var variable = 0;
return this.variable;
} console.log('函数中this指向:', outerFunction());
//输出结果:函数中this指向:test

从上面代码看出,函数中的this指向window对象,所以打印出的结果是test而不是0。

如果我们此时在outerFunction()函数里return this,此时控制台打印出Window {postMessage: , blur: , focus: , close: , parent: Window, …},表示this指向window对象。

值的注意的一点是在严格模式中,函数并不能绑定到this上,所以这时候的this是undefined。

再来看一个例子:

var a = 21;
var isObject = {
a: 'inner object',
innerFunction: function() {
return this.a;
}
}
var useObject = isObject.innerFunction;
console.log('结果:', useObject());
//输出结果:结果:21

可能有人会问,为什么输出的不是inner object,而是21,注意,this指向的是使用它时所在的对象,因为isObject.innerFunction将自身赋给全局变量useObject,所以此时useObject保存的是innerFunction()方法,this指向全局。

四、事件中的this

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body> <button onclick="this.style.display='none'">点我我就消失</button> </body>
</html>

很显然,在HTML事件句柄中,this指向了接收事件的HTML元素。

五、箭头函数中的this

需要注意的是,箭头函数内部并没有绑定this的机制,所以this的指向是固定的,即指向当前定义时所在的对象(注意,一般情况下,上下文环境不做变化,this为全局对象,即this定义在顶层环境)。也可以说,内部的this就是外层代码块的this。

var isObject = {
a: 'hhh',
functions: () => {
console.log("对象:",this);
}
}
isObject.functions();
//输出结果:对象:Window {postMessage: , blur: , focus: , close: , parent: Window, …}

可以看到,同样是对象方法,箭头函数里的this指向的是window对象。

再来看一个例子:

var isObject = {
a: 'hhh',
functions: () => {
this.a = 0
console.log("结果:",this.a);
}
}
isObject.functions();
//输出结果:结果:0

此时,在isObject对象functions方法内部定义了一个属性a,它属于this全局对象,所以输出结果为0。

难道this只能指向window了吗?答案是否定的,再来看一个例子:

function myFunction() {
var innerfunction = () => {
console.log('x:', this.x);
}
return innerfunction;
} var test = myFunction.call({x: 1}); test();
//输出结果:1

从上面代码可以看出,this此时指向myFunction里的对象{x:1},所以打印出的结果为1。注意,因为箭头函数本身并不能绑定this,所以它不能使用apply,call,bind方法来改变上下文环境。

JavaScript中的this对象指向理解的更多相关文章

  1. javascript中几种this指向问题

    javascript中几种this指向问题   首先必须要说的是,this 永远指向函数运行时所在的对象,而不是函数被创建时所在的对象. (1).作为函数名调用   函数作为全局对象调用,this指向 ...

  2. 详解javascript中的this对象

    详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ...

  3. JavaScript中的global对象,window对象以及document对象的区别和联系

    JavaScript中的global对象,window对象以及document对象的区别和联系 一.概念区分:JavaScript中的global对象,window对象以及document对象 1.g ...

  4. 【JavaScript】JavaScript中的ActiveXObject对象

    JavaScript中ActiveXObject对象是启用并返回 Automation 对象的引用.    使用方法: newObj = new ActiveXObject( servername.t ...

  5. JavaScript中的事件对象

    JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...

  6. JavaScript中创建字典对象(dictionary)实例

    这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...

  7. Javascript学习1 - Javascript中的类型对象

    原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...

  8. 简单使用JSON,JavaScript中创建 JSON 对象(一)

    JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...

  9. JavaScript中的window对象

    JavaScript中的window对象:http://www.cnblogs.com/kissdodog/archive/2013/01/01/2841464.html

随机推荐

  1. oracle table()函数

    PL/SQL表---table()函数用法/* PL/SQL表---table()函数用法:利用table()函数,我们可以将PL/SQL返回的结果集代替table. oracle内存表在查询和报表的 ...

  2. split文件切片

    文件上传下载过程中经常会遇到网络不稳定,或者传输软件限制传输的文件大小之类的问题.在当今换没有出现很好的软件的时候,一个available方法是将大文件切片,也就是 切成小文件,然后通过其他方法put ...

  3. 有关类朋友圈设计(3) -- 数据库设计&现有技术&流程设计

    在写之前,先说说当前的系统架构吧 spring cloud + zuul + eureka + oauth2 + redis + rabbitMq 这个系统是由我搭建的,当时采用的springClou ...

  4. 面试官:MySQL的幻读是怎么被解决的?

    大家好,我是小林. 我之前写过一篇数据库事务的文章「 事务.事务隔离级别和MVCC」,这篇我说过什么是幻读. 在这里插入图片描述 然后前几天有位读者跟我说,我这个幻读例子不是已经被「可重复读」隔离级别 ...

  5. 【简单数据结构】链表--洛谷P1160

    题目描述 一个学校里老师要将班上NN个同学排成一列,同学被编号为1\sim N1∼N,他采取如下的方法: 先将11号同学安排进队列,这时队列中只有他一个人: 2-N2−N号同学依次入列,编号为i的同学 ...

  6. Kubernetes-Pod介绍(四)-Deployment

    前言 本篇是Kubernetes第七篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kuberne ...

  7. mac php安装扩展 如 seoole apcu

    //下载 --安装 --复制扩展文件到对应目录 wget https://pecl.php.net/get/apcu-5.1.7.tgz tar -zvcf pcu-5.1.7.tgz cd 到解压目 ...

  8. POJ3734-Blocks【EGF】

    正题 题目链接:http://poj.org/problem?id=3734 题目大意 用思种颜色给\(n\)个格子染色,要求前两种颜色出现偶数次,求方案. \(1\leq T\leq 100,1\l ...

  9. 学会了这些英文单词,妈妈再也不用担心我学不会Python

    前言   很多转行或刚入行做测试的小伙伴学习Python时,经常会问一句话:我英语不好能不能学会代码. 答案是:肯定的!你如果英语好学开发语言肯定要比不会英语的小伙伴学起来.当代码报错时全是英文,毕竟 ...

  10. Python3入门系列之-----函数

    什么是函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己 ...