在 JavaScript 中 this 所指向的对象与运行时上下文进行绑定,这就会导致在不同场景下,函数最终运行结果可能不尽相同。

非对象/实例化环境

非对象/实例化环境指的是普通的函数( 没有通过原型方法构造对象的函数 )环境以及直接在全局下使用 this(如直接在页面的上输出 this)。

在非对象/实例化环境下,this 在不同开发环境指向的是不同的默认对象。在 Node.js 环境下,默认指向的是 module.exports,在浏览器环境,默认指向 window。

对象/实例化环境

在对象/实例化环境场景下,要分清 this 的作用域,只需看对象是什么。

普通对象

假如 this 在一个普通字典对象中,且通过该对象的属性或者方法直接访问这个 this,那么此时它指向的就是对象本身。 在下面这个例子中,当我们通过调用 Person.getName() 来获取对象本身的属性时,this 指向 Person 对象。

函数对象

假设我们通过 function 的方式,利用原型链构造一个类,然后通过对象的实例方法来调用 this。那么,此时 this 指向的就是该类的一个实例。

复用原型方法

承接上面的例子,若直接调用原型上的方法,this 指向的 Person.prototype 这个原型对象。所以若其他对象想将此方法复用在自身,就必须使用 bind、call、apply 将其绑定到自身对象上。

令人迷惑的现象

有了以上知识,我们就可以知道一个 this 到底指向的是哪个对象。甚至可以解读下面这个令人迷惑的例子中的 this 的指向。

这里 cardPicker 是由对象方法返回的函数,但它仍是一个普通函数。故函数中的 this 被置为默认对象——module.exports 或 window。由于默认对象中并没有card 和 suits 属性,故一旦 cardPicker 被用户调用,就会有 undefined 报错。

最后

关于 this,Typescript 对箭头函数中 this 指向的对象进行了合理化的改造——箭头函数中的 this 始终指向的是拥有此方法的对象本身。这样就不会产生上一节提到的那些违背“直觉”的现象。

参考链接

this ts 方法获取_浅谈 JavaScript / TS 中的 this相关推荐

  1. java 定时任务怎么关闭_浅谈springboot项目中定时任务如何优雅退出

    在一个springboot项目中需要跑定时任务处理批数据时,突然有个Kill命令或者一个Ctrl+C的命令,此时我们需要当批数据处理完毕后才允许定时任务关闭,也就是当定时任务结束时才允许Kill命令生 ...

  2. mysql declare与set的区别_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  3. python中if和elif的区别_浅谈对python中if、elif、else的误解

    今天下午在练习python时用了"if...if...else..."的分支结构,结果运行出来吓我一跳.原来我想当然的认为"if...if...else..." ...

  4. python中分支语句elif与else的区别_浅谈对python中if、elif、else的误解

    今天下午在练习python时用了"if...if...else..."的分支结构,结果运行出来吓我一跳.原来我想当然的认为"if...if...else..." ...

  5. java扫码枪键盘_浅谈在react中如何实现扫码枪输入

    触发原理 原理就是监听键盘输入,比如扫一个为6970596130126的69条形码,用扫码枪扫一下会在光标位置依次输出: 6 9 7 0 5 9 6 1 3 0 2 6 但这不是完整的,所以需要写一个 ...

  6. mysql存储过程set什么意思_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  7. python封装继承多态_浅谈JavaScript的面向对象和它的封装、继承、多态

    写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...

  8. mysql创建存储过程意义_浅谈一下mySql中创建存储过程

    首先说一下为什么要使用存储过程,存储过程是在数据库中预编译的程序代码,其执行效率显然要比从程序端传过去的sql语句要高的多,这样既可以节省网络带宽,又可以加快sql的执行速度,可以很好的提高系统的性能 ...

  9. join方法 js 单字符串会报错_浅谈JavaScript字符串拼接

    在JavaScript中会经常遇到字符串拼接,但是如果要拼接的字符串过长就比较麻烦了. 如果在一行的话,可读性太差:如果换行的话,会直接报错. 现在就来介绍几个JavaScript拼接字符串的几个小技 ...

最新文章

  1. MySQL 调优基础:Linux内存管理 Linux文件系统 Linux 磁盘IO Linux网络
  2. Android之linux基础教学之六 异常
  3. js new Date()不带时分秒时,时间变了 问题解决
  4. MyBatis-Plus 通用IService的使用
  5. .NET源码反编译和加密
  6. 不混淆某个方法_英文和拼音会混淆吗?这些事越早知道越好
  7. 虚拟硬盘VHD的程式化挂载方式
  8. dat图片 电脑端微信_微信 PC 版迎来了重磅更新,可以在电脑端使用小程序了 !...
  9. 82. Session 应用
  10. java excel通用导入类_java excel 文件导入通用接口
  11. MIT 线性代数 Linear Algebra 25: 对称矩阵的特征值特征向量,正定矩阵
  12. 今日头条定位融资商业计划书
  13. Docker部署MySQL监控工具Lepus
  14. diy个人级超级计算机,八核+七卡!泡泡网DIY个人超级计算机
  15. 【调剂】西安工业大学刘欢教授“宽光谱量子点成像”科研团队接收5名调剂学生...
  16. GB28181监控视频统一汇聚平台LiveGBS将海康大华华为宇视等厂家监控设备统一接入后如何生成固定播放链接或者固定的流地址可以直接无插件播放或者拉取
  17. Python简单绘制柱状图
  18. Hello 内存 cache 主存 外存
  19. 献给小白的笔记day6
  20. 收藏!AI从业者必备表情包!

热门文章

  1. 基于深度学习的鸟类检测识别系统(含UI界面,Python代码)
  2. ubuntu逻辑分区扩容
  3. UBUNTU zip 解压文件方法
  4. 形变(Deform)开关的本质
  5. STM32F030 BootLoader
  6. typora中图片转base64
  7. Deliveries(国际快递包裹跟踪软件)
  8. 人工智能python零基础入门教程_人工智能零基础入门视频教程
  9. 利用图吧工具箱内置的Diskgenius划分磁盘
  10. 学会BLDC电机控制必须搞懂的状态