this指向(連線上下文)···有圖解

前端小鐵人發表於2019-10-15

#this:

this(執行上下文): 【this的指向問題,我的見解就是三個字“肇事者”,情況有很多種,但是我們要撥開迷霧,找到‘凶手’】。 現在你就是沒有小蘭的柯南,真想只有一個!

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

2.在函式內,this是誰,取決於函式的呼叫方式:
    2.1 如果函式是直接呼叫的,函式內的this就是window
    2.2如果函式是以物件的方法呼叫的(如:xxx.func()),函式內的this就是方法前的物件(前例中的xxx).
    [誰呼叫函式就指向誰,就像是蚊子叮了你,你總要找到那個肇事者]
***注意***
    1)每個函式都有自己的this指向。所以進入函式後,this隨著函式的呼叫方式變化,this也是變化的。而且this的指向,不取決於定義在哪,而是取決於函式是誰呼叫的。
    
    var fullname = "Iron man";
    【喜歡鋼鐵俠的請你點個贊】
    function hello(str) {
        console.log(`我就是${this.fullname},${str}`)
    }
    hello("鋼鐵俠最cool")       //函式內的this就是window
    
    var p = {
        fullname:"Captain America",
        hello:function() {
         console.log(`你好,我叫${this.fullname}`)
        }
    }
    p.hello();
    
    var hi = p.hello()  //全域性定義了一個變數hi,將p物件的屬性hello的值給了hi
    hi()    //this是window【不要被誤導,這是直接呼叫】
    
    p.hi = hello
    p.hi("world")   //this就是p
    
    
    3.強行改變this的指向【俗稱掰彎this,難道這說明以前this是直的?】
    call是函式物件自己方法
    hello.apply(this想指向的物件,[傳給hello的引數們])
    hello.call(this指向的物件,傳給hello的第一個引數,傳給hello的第二個引數......)
    ***注意***
        呼叫函式的方法apply與call時,引數是馬上執行的。另外apply第二個引數是陣列。
        bind呼叫時,函式是不會立馬執行的,它比較調皮,返回的是一個新函式,新函式的this,就是你剛才bind的物件。
            比如說:
            var newFunction = hello.bind(this指向的物件);
            【新函式內,this就是bind的引數】
    //呼叫全域性的hello,讓hello內的this指向p
    hello.apply(p,["我是一個陣列"])
    hello.call(p,"我不是陣列")
    var newHello = hello.bind(p)
    newHello("希望大家喜歡我的部落格")
    
    4.建構函式內的this,在new時,建構函式內的this,指向新建立的物件,new前面的那個“帥哥”。
    
    5.箭頭函式,沒有自己的this。如果在箭頭函式中出現了this,會像父級作用域找this,知道找到為止。
    (箭頭函式就是一個“變種人”,而且不是金剛狼的那種。)
複製程式碼

this指向(連線上下文)···有圖解
this指向(連線上下文)···有圖解
this指向(連線上下文)···有圖解
this指向(連線上下文)···有圖解
this指向(連線上下文)···有圖解

相關文章