js中的this是一个指针型变量,它动态指向当前函数的运行环境,它固定不变的,而是根据调用的上下文(执行时环境)改变而改变;
不同使用条件下this 的指向
- 在全局执行环境中(在任何函数体外部)
this
都指向全局对象globalThis
,(在浏览器中全局对象为window
); - 在方法中,
this
表示该方法所属的对象; - 在函数中,
this
的值取决于函数被调用的方式和模式:- 普通函数中:
- 严格模式下,函数中的
this
为undefined
; - 在非严格模式下,
this
的默认指向全局对象;
- 严格模式下,函数中的
- 箭头函数中: 箭头函数中没有
this
,也可以认为箭头函数中的this
会继承定义函数时的上下文,可以理解为和外层函数指向同一个this
,也就是this
指向于函数作用域所处的对象; - 构造函数中: 构造函数中的
this
是指向实例;
- 普通函数中:
- 在对象中:对象内部方法的
this
指向调用这些方法的对象,也就是谁调用就指向谁:- 函数的定义位置不影响其
this
指向,this
指向只和调用函数的对象有关; - 多层嵌套的对象,内部方法的
this
指向离被调用函数最近的对象;
- 函数的定义位置不影响其
- 在原型链中:对于在对象原型链上某处定义的方法,同样的概念也适用。如果该方法存在于一个对象的原型链上,那么 this 指向的是调用这个方法的对象,就像该方法就在这个对象上一样;
- 在类中:
- 在类的构造函数中,
this
是一个常规对象,类的静态方法属于类的自身的属性,类的非静态方法会添加到this
的原型中; - 派生类中,派生类的构造函数没有初始化
this
绑定,在构造函数中调用super()
会生成一个this
绑定,派生类不能在调用super()
之前返回,除非其构造函数返回的是一个对象,或者根本没有构造函数;
- 在类的构造函数中,
- 在事件中,在
HTML
事件句柄中,this
指向了接收事件的HTML
元素;
this的使用
- 获取属性的对象;
- 获取DOM元素;
- 在函数体内部,引用当前环境的其他变量;
修改this指向的方法(之前详细写过)
- call();
- apply();
- bind();