JavaScript:this指针
this指针,存储的是一个内存地址,如同变量一样,指向一块内存区域;
而这个内存区域,保存的就是一个对象的数据,那么这个对象是什么呢?
通常来说,this指针,主要是用在方法(函数)中,用来指向调用方法(函数)的对象;
比如说,有个方法eat(),这个方法里面有个this指针;
当Tom调用eat时,this指针指向的就是"Tom";
当Jerry调用eat时,this指针指向的就是"Jerry";
也就是说,this指针,总是指向直接调用者。
好,现在我们来看一下,两个不同于上面所述规则的特殊情况:
”没有“调用者
看下面代码:

我们知道,如果是使用
var声明的变量,实际上是成为了window对象的方法,那么aaa()实际上就是window.aaa(),也就是省略了window的写法,那么,this指向的就是window对象,我们可以理解;但是,上面我们使用
let声明的变量,为什么this指向的还是window对象呢?要知道,
let声明的函数,并不是window对象的方法,window对象也无法调用,那么此时aaa()是由谁调用的呢?我们现在无法得知,但是可以肯定的是,绝对不是window对象;再来看函数
aab(),虽然它是function声明的函数,但是因为它是在代码块中声明的,所以它也不是window对象的方法,那么aab()又是被谁调用的呢?为什么它的this指针,也指向window对象呢?事实上,这是历史遗留问题,如果我们开启了严格模式,此时两个this将都会是
undefined,这是符合逻辑的,既然“没有”调用者,那么this就没有指向,当然就是undefined;如下所示,就印证了我们前面所说的:

箭头函数没有this指针
首先说明,箭头函数,确实没有自己的this指针;
也就是说,箭头函数里面的this,并不能指向调用箭头函数的对象;
那么,此时this,指向的是谁呢?
看下面代码:

我们将上图与上上图进行比较,仔细观察一下输出结果的不同;
在严格模式下,上图三个this指向的都是
window对象,与上上图完全不一样,这至少说明,箭头函数的this,和function声明的函数的this,有不同的表现;再看下面这个代码:

上图与上上图的区别,就是在最后一行代码,我们将obj1作为obj2的一个对象,从而再多一次调用
arrow()方法,结果依然还是指向window对象,似乎无论增加多少次中间调用者,最终都会指向window对象,说明箭头函数的this,并不是在指向调用箭头函数的对象;现在我们尝试,将箭头函数
arrow的可见性,降低一些,看下面的代码:
上图将箭头函数
内arrow的可见性,控制在了用关键字function声明的函数外arrow内部,这样,要使用箭头函数,就得调用外arrow;对于
arrow(),上面我们已经讨论过,此时外arrow函数“没有”调用者,所以this是undefined;对于
obj1.arrow(),此时this指向,调用外arrow函数的obj1;对于
obj2.arrow(),此时this指向,调用外arrow函数的obj2;对于
obj2.obj1.arrow(),此时this指向,调用外arrow函数的obj1,注意,此时obj2调用obj1,而obj1调用外arrow函数,所以this指向obj1;可以看到,this的表现,完全就是
外arrow函数的this指针的表现;也就是说,此时,箭头函数的this,其实并不属于箭头函数,而是属于包围箭头函数的外部代码块,在这里也就是指
外arrow函数;所以,在考虑箭头函数的this指针的指向的时候,我们完全可以把箭头函数当成一般的执行语句,而不是一个函数,这也是为什么说箭头函数没有this指针的缘故;
现在回过头看上上图,我们就能理解,此时箭头函数是直接在script标签中的,作为一个普通的执行语句,它的外层只剩下浏览器窗口,也就是
window对象了,所以这些this指针才全部指向window对象;
总结:
- this指针,总是指向它所在函数体的直接调用者;
- 直接
函数名()这样“没有”调用者的函数调用,在严格模式下,this为undefined;在普通模式下,this指向window对象; - 箭头函数没有this指针,此时将箭头函数当做一般语句,this指针属于箭头函数所在的函数体的直接调用者;而且注意,如果箭头函数是全局作用域的话,无论什么模式,this总是指向
window对象;
JavaScript:this指针的更多相关文章
- javascript this指针指向?
前言 理解javascript的指针就需要先了解js的执行环境和作用域!执行环境的定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象,环境中定义的所有的变 ...
- Javascript this指针
Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象. 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对 ...
- JavaScript中指针和地址理解
个人理解:指针只是指向内存的一个索引:而地址则是内存中确切的位置. 下面是函数中关于指针和地址一个小例子: function sum(num1,num2){ return num1+num2; } a ...
- javascript面向对象规则汇总以及json
javascript中一切皆对象,而且定义非常灵活, 于是出现了一些相对其他编程语言环境下匪夷所思的代码: ---------------------------------------------- ...
- 【译】 沙箱中的间谍 - 可行的 JavaScript 高速缓存区攻击
王龑 - MAY 27, 2015 原文连接 The Spy in the Sandbox – Practical Cache Attacks in Javascript 相关论文可在 https:/ ...
- javascript之面试题精讲
from:http://blog.csdn.net/q121516340/article/details/51332454 1,检测数组的几种方式: Array.isArray(); es5 toSt ...
- [译] 沙箱中的间谍 - 可行的 JavaScript 高速缓存区攻击
原文 The Spy in the Sandbox – Practical Cache Attacks in Javascript 相关论文可在 https://github.com/wyvernno ...
- 对Ajax连接的认识~为毛不能上传文件!!!
最近做毕设的时候需要用到上传图片的功能,但是我的毕设全部的传输都是基于ajax的请求,百度了一圈发现TMD居然说ajax不能上传文件!!当时我就不乐意了啊,那难道其他人都用的是黑科技吗?!又来网上的大 ...
- c#知识总结1
一.C#程序结构 一个c#程序主要包括以下部分 ①命名空间声明 ②一个class ③class方法 ④class属性 ⑤一个main方法 ⑥语句 和 表达式 以及 注释 简单的“Helloworld” ...
- 前端面试题目汇总摘录(JS 基础篇)
JS 基础 JavaScript 的 typeof 返回那些数据类型 object number function boolean undefined string typeof null; // o ...
随机推荐
- Node.js(六)MongoDB
student.js var express = require('express'); var router = express.Router(); const _=require("lo ...
- 洛谷P1115 最大子段和 (线性DP)
经典的线性DP例题,用f[i]表示以第i个位置结尾的最大连续子段和. 状态转移方程:f[i]=max(f[i],f[i-1]+a[i]); 这里省去了a数组,直接用f数组读数据,如果f[i-1]< ...
- Java学习之路:快捷键
常用的快捷键 Ctrl+Shift:切换输入法 Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+X:剪切 Ctrl+A:全选 Ctrl+Z:撤销 Ctrl+Y:返回撤销 Ctrl+S:保存 Shif ...
- RabbitMQ安装说明文档(超详细版本)
RabbitMQ安装说明文档(超详细版本) 1. 安装依赖环境 在线安装依赖环境: yum install build-essential openssl openssl-devel unixODBC ...
- .NET Conf 2022 – 11 月 8 日至 10 日
.NET Conf 2022 下周就正式开启了,时间是美国时间的 11月8日至10日..NET Conf 2022是一个免费的,为期三天的, 虚拟开发人员活动提供多种实时会话,其中包括来自社区和 .N ...
- node 创建服务器方法
方法一 let http = require('http') let httpserver = http.createServer(function(req,res){ res.writeHead(2 ...
- Azure Devops Create Project TF400711问题分析解决
前几天,团队使用Azure Devops创建团队项目出了一个奇怪的错误: TF400797: 作业扩展具有一个未处理的错误: Microsoft.TeamFoundation.Framework.Se ...
- mybatis-plus分页失效原因
mybatis-plus分页失效解决方法 方法一.在启动类添加如下配置 @SpringBootApplication @MapperScan("com.**.mapper") pu ...
- Kubernetes_k8s持久化存储(亲测可用)
一.前言 新建具有两个节点的k8s集群,主节点(master节点/m节点)的ip地址是192.168.100.150,从节点(w1节点)的ip地址是192.168.100.151. 本文操作如何将po ...
- 【第6篇】AI语音测试简介
1.4 AI语音测试简介 AI语音测试是针对人工智能语音交互的测试,人工智能语音交互一般包含语音识别技术(ASR).自然语言处理技术(NLP)和语音合成技术(TTS)等3大部分,通俗地来讲AI语音测试 ...