如果去用一句话去说明this指向问题,那么既是:谁调用它那么this就指向谁。
但是仅通过这句话,我们很多时候并不能准确判断this指向。因此我们需要一些规则去帮助自己去判断:
浏览器环境:无论是否在严格模式下,在全局执行环境中,this都指向全局对象window;
是否是new绑定:
如果是new绑定,并且构造函数中没有返回function或者是object,那么this指向的这个新对象。
函数是否通过call,apply调用,或者是用了bind绑定,如果是那么this绑定的就是制定的对象。可以归结为显示绑定
function info(){
sonsole.log(this.age)
}
var person={
age:20,
info
}
var age=28;
var info=person.info;
info.call(person); //20
info.apply(person);//20
info.bind(person)();//20
同时我们还需要注意一中特殊情况,如果call,apply或者bind传入的第一个参数值是undefiend或者null,严格模式下this的值为传入的值null/undefiend。非严格模式下,实际应用的默认绑定规则,this指向全局对象。
隐式绑定,函数的调用时在某个对象上处罚的,即调用位置上存在上下文对象。典型的隐式调用为:xxx.fn()
默认绑定,在不能应用其他绑定规则时使用的默认规则,通常是独立函数调用。
箭头函数的情况:
箭头函数没有自己的this,继承外层上下文绑定的this