this指向(连接上下文)···有图解

335 阅读2分钟

#this:

this(执行上下文): 【this的指向问题】。

1.在全局作用域:this就是window。

2.在函数内,this是谁,取决于函数的调用方式:
    2.1 如果函数是直接调用的,函数内的this就是window
    2.2如果函数是以对象的方法调用的(如:xxx.func()),函数内的this就是方法前的对象(前例中的xxx).
    [谁调用函数,this就指向谁]
    
***注意***
    1)每个函数都有自己的this指向。所以进入函数后,this随着函数的调用方式变化,this也是变化的。而且this的指向,不取决于定义在哪。
    
    var fullname = "Iron man";
    
    function getName(str) {
        console.log(`我就是${this.fullname},${str}`)
    }
    getName("钢铁侠最cool")       // 函数内的this就是window
    
    var p = {
        fullname:"Captain America",
        getName:function() {
         console.log(`I can do this all day --- ${this.fullname}`)
        }
    }
    p.getName(); // this ==> p
    
    var hi = p.getName()  //全局定义了一个变量hi,将p对象的属性getName的值给了hi
    hi()    // this ==> window【不要被误导,这是直接调用】
    
    p.hi = getName;
    p.hi("world")   //this就是p
    
    
    3.强行改变this的指向【俗称掰弯this1. call是函数对象自己方法; getName.call(this指向的对象,传给getName的第一个参数,传给getName的第二个参数......)
        2. getName.apply(this想指向的对象,[传给getName的参数们];
  
    ***注意***
        调用函数的方法apply与call时,参数是马上执行的。另外apply第二个参数是数组。
        
        3. bind调用时,函数是不会立马执行的,它比较调皮,返回的是一个新函数,新函数的this,就是你刚才bind的对象。
            比如说:
            var newFunction = getName.bind(this指向的对象);
            【新函数内,this就是bind的参数】
            // 调用全局的getName,让getName内的this指向p
            hello.apply(p,["我是一个数组"])
            hello.call(p,"我不是数组")
            var newHello = hello.bind(p)
            newHello("希望大家喜欢我的博客")
    
    4.构造函数内的this,在new时,构造函数内的this,指向新创建的对象,new前面的那个“实例”。
    
    5.箭头函数,没有自己的this。如果在箭头函数中出现了this,会像父级作用域找this,知道找到为止。