javascript的this指向
场景
我们先来看几个函数调用的场景:
var a = 1;
function make(){
console.log(this.a)
}
make();
const obj = {
a: 2,
make: make
}
obj.make();
let c = new make();
不知结果与你想的是否一样呢!
结果
小结
- 对于直接调用make()这个普通函数来说,不管make()函数放在任何地方,this指向始终是window。
- 对于obj.make()这种用法来看,我们只需要记住,谁调用了make(),谁就是this,在这种情况下,this指向的就是obj对象。
- 通过new来构造实例,this被永远绑定在c上,并且不会被任何方式改变this。
箭头函数中的this
function a() {
return () => {
return () => {
console.log(this)
}
}
}
console.log(a()()())
箭头函数中是没有this的,箭头函数里的this,来自包裹箭头函数的第一个普通函数(或者是在全局),在这个例子中,由于包裹箭头函数的是一个普通函数a(),所以this是window,另外箭头函数是无法使用bind方法。
使用bind方法
对于使用bind方法的这个函数,this取决于第一个参数,如果第一个参数是空的话,那么this就是window。
那如果对函数使用使用多个bind,那么函数的上下文将会是什么?
let b = 1;
function fn(){
console.log(this)
}
fn.bind().bind(a)();
结果是window,不知道这个结果与你想的是一样的吗?,原因是,不管bind多少次,fn的this只取决于第一次bind,显然,这里是this是window。
如果多个规则同时出现的话,this的指向取决于规则的优先级(由高到低):
- new的方式
- bind
- 对象属性(obj.make())
- 直接调用(make()
结尾处,欢迎交流学习,纠错。