函数中的this指向

1. 普通函数的this

普通函数的this : this就是谁调用 this就指向谁 this是在调用的时候确定的

function f1(){
	console.log(this);
}
f1(); //window

2.对象里面的方法this

对象里面的方法,它里面的this指向当前这个对象

var obj = {
    a : 6,
    b : 7,
    name : "zhangshang",
    print(){
        // console.log(this.a + this.b);
        console.log(1111111);
        console.log(this);
    }
}
//obj.print();//{a:6,b:7,name: "zhangshang", print: ƒ}
var fn = obj.print;
//var fn = obj.print();//undefuned
//fn(); //this 指向 window // 1111111 window
obj.print = f1;
obj.f2(); // this 指向 obj //  {a: 6, b: 7, name: "zhangshang", print: ƒ, f2: ƒ}

3.特殊的 :定时器 this

特殊的 :定时器 this 在 普通函数中(包括对象中的this) 一定指向 window

setTimeout(f1,100);  //window
setTimeout(obj.print,100);   //window

setTimeout(obj.print(),100);   // 定时器里面的参数1是obj.print()的返回值undefined 和定时器的this指向没有任何关系 
//只是把obj.print()调用了一遍 相当于 打印的this 也是 指向 obj
var res = obj.print();  //this 指向 obj
setTimeout(res,100);

var name = "我在window里面";
var obj1 = {
    name : "我是obj1里面的",
    fn(){
        console.log(this);
        var that = this;
        console.log(that);
        setTimeout(function(){
            console.log(this.name); //  我是window里面的
            console.log(that.name); //  我是obj1里面的
        },1000)
    }
}
obj1.fn(); //this 指向 obj //{name: "我是obj1里面的", fn: ƒ}
//"我在window里面" "我是obj1里面的" 定时器里面打印内容 定时器里面的this在普通函数中一定指向window

4.在ES6 箭头函数里面的this

在ES6 箭头函数里面的this是继承自父级执行上下文中的this

箭头函数没有自己的this 它的this是从父级继承而来的 在声明的时候就已经确定了

var name = "我在window里面";
var obj1 = {
    name : "我是obj1里面的",
    fn(){
        console.log(this);//obj1
        var that = this;
        console.log(that);
        setTimeout(() => {  //箭头函数的this指向继承自父级执行上下文中的this 在声明的时候就已经确定了
            console.log(this.name); //  我是obj1里面的
            console.log(that.name); //  我是obj1里面的
        },1000);
    }
}
obj1.fn();

var name = "我在window里面";
var obj1 = {
    name : "我是obj1里面的",
    fn : () => { //父级也是箭头函数 那么它的this指向为(obj1对象执行上下文中的this)window
        console.log(this);//window
        var that = this;
        console.log(that);
        setTimeout(() => {  //箭头函数的this指向继承自父级执行上下文中的this 在声明的时候就已经确定了
            console.log(this.name); //  我是window里面的
            console.log(that.name); //  我是window里面的
        },1000);
    }
}
obj1.fn();

5.构造函数中的this

function Student(name,age){
    this.name = name;
    this.age = age;
    console.log(this);
}

1.把构造函数当成普通函数调用 this指向和普通函数一样

Student("张三",18); //打印 window

2.正常使用 this指向新创建的对象

var s1 = new Student("张三",18); //打印 Student {name: "张三", age: 18}

3.当作为构造函数时 返回值默认是new关键字创建的实例化对象 但是 如果手动添加了返回值 那么 如果是基本数据类型 就不会影响 如果是复杂数据类型 那么就会覆盖掉默认的返回值

function Student(name,age){
    this.name = name;
    this.age = age;
    console.log(this); //Student {name: "lili", age: 16}
    // return {
    //     name : '111111',
    //     age : 1111111
    // }
    return [12,13,15]
}
var s1 = new Student("lili",16);
console.log(s1); //[12, 13, 15]
console.log(s1.age); //undefined

6.总结

普通函数 : this是在调用的时候确定 谁调用 this就指向谁

箭头函数 :this是在声明的时候就已经确定 而且不会改变 this是继承自父级执行上下文的this

    原文作者:qq_42438026
    原文地址: https://blog.csdn.net/qq_42438026/article/details/107368403
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞