认识this指向问题

242 阅读2分钟

在前端开发中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值。