- 全局作用域或直接调用的函数,浏览器环境为window,nodejs环境为global
- 对象显示调用的函数,为对象,多层调用指向最后一层调用的对象
- call、apply、bind会改变普通函数的this,且bind绑定多次只有第一次生效
- new,例如class、构造函数,为new出来的对象
以上是所有情况,优先级为4 > 3 > 2 > 1,下列是特殊情况。
- 箭头函数,为上下文的this,上下文具体指包裹箭头函数的第一个普通函数的this,call、apply、apply不会改变箭头函数的this
- 数组函数,forEach有两个参数,第一个是回调函数,第二个是this指向的对象,如果只传入了回调函数,第二个参数没有传入,默认为undefined,所以回调函数的this为window或global,除了forEach,需要传入this指向的函数还有:every、find、findIndex、map、some等
- 回调函数(包括setTimeout、setInternal)、立即执行函数,如果是普通函数取决于调用,如果是箭头函数取决于定义
- 在严格模式下,window被替换为undefined