在前端开发中this是我们非常熟悉的一个概念,下面我们来简单梳理下this的不同使用场景。
一、要明确的是this的指向不是在编写时确定的,而是在执行时确定的。
1、首先,在默认的情况下,this是指向全局对象的,比如在浏览器就是指向window:
name = 'lily';
function sayName(){
console.log(this.name);
};
sayName() //lily
2、其次,如果函数被调用的位置存在上下文对象时,那么函数是被隐式绑定的。
function fn(){
console.log(this.name);
}
var obj = {
name:'lucy',
f:fn
};
obj.fn(); //lucy,被调用的位置恰好被对象obj所有
3、再次,显式绑定,要改变this指向,常见的方法有:call apply bind这三者;
function fn() {
console.log( this.name );
}
var obj = {
name: "lucy",
};
var obj1 = {
name: "lily"
};
fn.bind(obj)(); //lucy ,由于bind将obj绑定到f函数上后返回⼀个新函数,因此需要再在后⾯加上括号进⾏执⾏,这是bind与apply和call的
区别
4、最后,也是优先级最高的绑定new绑定,用new调用一个构造函数,会创建一个新对象,在创造这个新对象的过程中新对象会自动绑定到person对象的this上,那么这个this就指向这个新对象。
function Person(name){
this.name =name;
console.log(name);
}
var person1 = new Person('lucy') //lucy
绑定优先级:new绑定>显式绑定>隐式绑定>默认绑定
二、箭头函数的this指向
1、箭头函数没有自己的this值;
2、它的this是捕获其所在上下文的this值;
3、箭头函数是不会被new调用的;
4、它的this值也不会被改变,使用call\apply\bind都不能改变;
三、setTimeout中this的指向
1、超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined;
2、可以使用箭头函数的方式将this指向上下文的this值。