(1)事件调用环境:谁触发事件,函数里面的this指向就是谁(某个DOM)。
(2)node全局环境:this指向module.exports
(3)浏览器全局环境:this指向window
(4)函数内部:
(4.1)函数自己调用(不是对象调用)严格模式下:undefined,非严格模式下 :this指向window
(4.2)函数被对象调用,this指向最终调用函数的对象。注意是调用时的,不是定义时的。
(4.3)构造函数中没有return语句,构造函数中的this指向的是实例对象
构造函数有return返回值,返回值类型为基本类型,构造函数中的this指向的是实例对象
构造函数有return返回值,返回值类型为引用类型,构造函数中的this指向返回值的对象
(5)箭头函数:箭头函数的上一层作用域的this
箭头函数本身是没有this和arguments的,在箭头函数中引用的this实际调用的是定义这个箭头函数的上一层作用域的this。这里强调一下是上一层作用域,因为对象是不能形成独立的作用域的。
修改this指向三种方法:
(1) call(this,a,b,c)
(2) apply(this,[a,b,c])
(3) bind(this,a,b,c)()
在定义箭头函数时已决定箭头函数中this指向,定义后想再通过call来修改函数中的this指向是做不到的,普通函数可以做到用call修改this指向。
脑图总结:
附一道经典面试题: