在JS中this指向的几种情况
明确:大部分时候,this的指向取决于函数的调用方式
- 如果直接
调用函数
(全局调用),this指向全局对象或undefined (启用严格模式)
在es6的类中,默认是会自动开启严格模式的,
上面的直接调用包括,先把函数保存到一个变量中,然后在执行,例如:
var obj = {sayHello(){ console.log(this) }} var say = obj.sayHello; say()
- 如果使用对象.方法调用,this指向对象本身
- 如果是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>
特殊情况:
- 箭头函数,this在函数声明时确定指向,指向函数位置的this
- 使用bind、apply、call手动绑定this对象
function hello(thing) { console.log(this + " says hello " + thing); } hello.call("Yehuda", "world") //=> Yehuda says hello world
ts 中的this 问题
对象里面的this推断
分析: 我们可以仔细想一想,在这个对象中,这个this 的指向是啥,这两有两种情况:
- 直接是obj.sayHello() 这种方式,我们知道this 指向是 obj
- 如果是保存到变质量中,this的指向是 全局对象,
针对这两种情况, 个人觉得 ts 的考虑是,首先不给你代码提示(没有代码提示在ts是危险的),由于ts 是静态的类型检查系统,他并不知道,开发者是使用哪种方式调用
类中的类型推断
这里面的问题和上一个问题差不多,就是不明白开发者的调用方式
解决ts 中this 只能推断的问题
如果需要ts 对 this的检查,需要强制的类型,就可以使用下面的方法
配置noImplicitThis:true,表示不允许this隐式的指向any ,配置好后的效果,如下:
对象的是解决了,但是类中还是一样的
手动指向
在TS中,允许在书写函数时,手动声明该函数中this的指向,将this作为函数的第一个参数,该参数只用于约束this,并不是真正的参数,也不会出现在编译结果中。