this指向(鏈接上下文)···有圖解

#this:數組

this(執行上下文): 【this的指向問題,個人看法就是三個字「肇事者」,狀況有不少種,可是咱們要撥開迷霧,找到‘兇手’】。 如今你就是沒有小蘭的柯南,真想只有一個!app

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,知道找到爲止。
    (箭頭函數就是一個「變種人」,並且不是金剛狼的那種。)
複製代碼

相關文章
相關標籤/搜索