this的指向不是在编写时确定的,⽽是在执⾏时确定的,同时,this不同的指向在于遵循了⼀定的规则。
⾸先,在默认情况下,this是指向全局对象的,⽐如在浏览器就是指向window。
其次,如果函数被调⽤的位置存在上下⽂对象时,那么函数是被隐式绑定的。
function f() {
console.log( this.name );
}
var obj = {
name: "Messi",
f: f
};
obj.f();
再次,显示改变this指向,常⻅的⽅法就是call、apply、bind
箭头函数不同于传统JavaScript中的函数,箭头函数并没有属于⾃⼰的this,
它的所谓的this是捕获其所在上下⽂的 this值,
作为⾃⼰的 this 值,并且由于没有属于⾃⼰的this,⽽箭头函数是不会被new调⽤的,
这个所谓的this也不会被改变.
1.使用普通函数
var obj={
fn:function(){
setTimeout(function(){
console.log(this);
});
}
}
obj.fn();
这次this指向了最外层的window对象,为什么呢,还是那个道理,
这次this出现在全局函数setTImeout()中的匿名函数里,并没有某个对象进行显示调用,
所以this指向window对象
2.使用箭头函数
var obj={
fn:function(){
setTimeout(() => {
console.log(this);
});
}
}
obj.fn();
this又指向函数的宿主对象了
总结:
1.箭头函数的this绑定看的是this所在的函数定义在哪个对象下,绑定到哪个对象则this就指向哪个对象
2.如果有对象嵌套的情况,则this绑定到最近的一层对象上