this指向约束

简介: this指向约束

在JS中this指向的几种情况


明确:大部分时候,this的指向取决于函数的调用方式


  • 如果直接调用函数(全局调用),this指向全局对象或undefined (启用严格模式)


20210126141347259.png


20210126141500557.png


在es6的类中,默认是会自动开启严格模式的,

上面的直接调用包括,先把函数保存到一个变量中,然后在执行,例如:

var obj = {sayHello(){ console.log(this) }} var say = obj.sayHello; say()


  • 如果使用对象.方法调用,this指向对象本身


20210126141640396.png


  • 如果是dom事件的处理函数,this指向事件处理对象


 <!DOCTYPE html>
 <html lang="en">
 <head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Document</title>
 </head>
 <body>
   <div onclick="console.log(this)" style="width: 100px;height: 100px;background-color: aliceblue;"></div>
 </body>
 </html>


20210126142557427.png


特殊情况:


  • 箭头函数,this在函数声明时确定指向,指向函数位置的this


20210126143051392.png


  • 使用bind、apply、call手动绑定this对象


function hello(thing) {
 console.log(this + " says hello " + thing);
}
hello.call("Yehuda", "world") //=> Yehuda says hello world


ts 中的this 问题


对象里面的this推断


20210126144249802.png


分析: 我们可以仔细想一想,在这个对象中,这个this 的指向是啥,这两有两种情况:


  • 直接是obj.sayHello() 这种方式,我们知道this 指向是 obj
  • 如果是保存到变质量中,this的指向是 全局对象,

针对这两种情况, 个人觉得 ts 的考虑是,首先不给你代码提示(没有代码提示在ts是危险的),由于ts 是静态的类型检查系统,他并不知道,开发者是使用哪种方式调用


类中的类型推断


20210126150456918.png


这里面的问题和上一个问题差不多,就是不明白开发者的调用方式


解决ts 中this 只能推断的问题


如果需要ts 对 this的检查,需要强制的类型,就可以使用下面的方法


配置noImplicitThis:true,表示不允许this隐式的指向any ,配置好后的效果,如下:


20210126150739297.png


对象的是解决了,但是类中还是一样的


20210126150832697.png


手动指向


20210126150933821.png


在TS中,允许在书写函数时,手动声明该函数中this的指向,将this作为函数的第一个参数,该参数只用于约束this,并不是真正的参数,也不会出现在编译结果中。


20210126151143873.png

相关文章
|
8月前
|
存储 安全 算法
定义指针
定义指针
57 1
|
8月前
|
存储 C++
20指针关系
20指针关系
42 1
|
8月前
|
存储 Java 编译器
C 语言指针完全指南:创建、解除引用、指针与数组关系解析
创建指针 我们可以使用引用运算符 & 获取变量的内存地址:
318 0
|
Oracle 关系型数据库 索引
唯一约束和唯一索引区别
唯一约束和唯一索引区别
947 0
|
数据可视化 开发者
使用VFL创建约束对象
使用VFL创建约束对象
117 0
|
C语言
【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )
【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )
590 0
【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )
【约束布局】ConstraintSet 约束集 ( 简介 | 约束属性集合 | 约束集初始化 | 约束集应用到布局中 | 关键帧动画 | TransitionManager 使用 )(二)
【约束布局】ConstraintSet 约束集 ( 简介 | 约束属性集合 | 约束集初始化 | 约束集应用到布局中 | 关键帧动画 | TransitionManager 使用 )(二)
469 0
【约束布局】ConstraintSet 约束集 ( 简介 | 约束属性集合 | 约束集初始化 | 约束集应用到布局中 | 关键帧动画 | TransitionManager 使用 )(二)
|
Java 开发者
级联属性赋值|学习笔记
快速学习 级联属性赋值
212 0
 级联属性赋值|学习笔记
接口的讲解-强制约束-可选属性-任意多个属性-只读属性
接口的讲解-强制约束-可选属性-任意多个属性-只读属性