this的调用一般分为以下几种
- 默认绑定
- 隐式绑定
- 显式绑定
- new绑定
- 箭头函数上下文绑定
其实看this到底是谁,取决与被谁调用,之前有个博文说得 好
this的指向取决于前面那个点
1,默认绑定
foo();
这里的foo里如果使用了this,这个this在非严格模式是指向了全局的window对象
因为他没被其他任何人调用,也就是...前面没点
2,隐式绑定
obj={
foo(){}
}
obj.foo();
这时候foo的this会指向obj,也就是绑定到了上下文对象上,也就是调用他的对象上。
当然这时候看点, .foo 前面是 obj 所以this = obj
如果是这样
bar=obj.foo;
bar();
这时候bar的this又变成了window,就是变回了默认绑定,因为没有调用方
3,显式绑定
obj={}
foo(){}
foo.call(obj)
foo.apply(obj)
foo.bind(obj)
这种相当于强制绑定,直接把this强制绑到了obj上
4,new绑定
new foo();
这里要牵扯到new的实现了,内部使用了'类似'显式绑定的方法
新建一个对象,通过调用目标函数的call来显示绑定到新建的对象上,形成this
5,箭头函数
箭头函数的this取决于声明时候的当前上下文,也就是说本身不具备this
这里有个坑就是如果你声明一个函数,声明的时候用了箭头函数声明,还在里面使用了this,
这时候this指的其实是 默认绑定的结果
window.a=1;
let obj={
a:2,
say:()=>{
console.log(this.a);
},
hey:function(){
console.log(this.a);
}
}
obj.say(); //1
obj.hey(); //2
总结一下:
- 由 new 调用?绑定到新创建的对象。
- 由 call 或者 apply(或者 bind)调用?绑定到指定的对象。
- 由上下文对象调用?绑定到那个上下文对象。
- 默认:在严格模式下绑定到 undefined,否则绑定到全局对象
- 箭头函数指向作用域