你真的懂this指向?

先搞清楚一點,如果this在函數(shù)里面,那么它指向的是“函數(shù)執(zhí)行后”的上一級調(diào)用對象。

        var a="this is a";
        function main() {
        console.log(this.a)//這里this指向window.
        }
        main()//這里相當于window.main(),默認window對象了,所以可以省略;



var o={
            x:"this is x",
            y:"this is y",
            say:function(){
                console.log(this.x);
            }
        }
        o.say();//這里的this指向的是對象o,因為你調(diào)用這個say是通過o.say()執(zhí)行的,那自然指向就是對象o,這里再次強調(diào)一點,this的指向在函數(shù)創(chuàng)建的時候是決定不了的,在調(diào)用的時候才能決定,誰調(diào)用的就指向誰,一定要搞清楚這個。



var o={
            name:"maomin",
            say1:function(){
                console.log(this.name);//maomin
            }
        }
        window.o.say1();
        // 上面幾行代碼和之前的代碼幾乎相似,為什么沒有指向window,這就回到了我剛開始說的,this如果在函數(shù)內(nèi),那么它指向的是該函數(shù)執(zhí)行后的上一級調(diào)用對象。



var o={
             a:"this is a",
             b:{
                 a:"I am a",
                 say:function(){
                     console.log(this.a);//this is a
                 }
             }
         }
         var f=o.b.say;
         f();
    // 這里肯定有疑問了?為什么會指向o呢,不是應該指向b嗎?這時你應該注意到這里say沒有調(diào)用執(zhí)行,而是通過o.b.say賦值給變量f,然后才被執(zhí)行。這樣就指向o了。



    function Fn(job){
            this.job=job;
        }
        var i=new Fn("I am Engineer");
        console.log(i.job);//I am Engineer
    // 這里是一個構(gòu)造函數(shù),注意的是this指向構(gòu)造函數(shù)new出來的對象。
    // 首先new關(guān)鍵字會創(chuàng)建一個空的對象,然后會自動調(diào)用一個函數(shù)的一個方法,將this指向這個空對象,這樣的話函數(shù)內(nèi)部的this就會被這個空的對象替代。



    function Fn1(age){
            this.age=age;
            return {};
        }
        var ii=new Fn1("I am 21");
        console.log(ii.age);//undefined
        function Fn2(love){
            this.love=love;
            return function(){

            }
        }
        var iii=new Fn1("My grilfriend is xqm");
        console.log(iii.love)//undefined
        function Fn3(like){
            this.like=like;
            return 1;
        }
        var iiii=new Fn3("I like playing CF")
        console.log(iiii.like)//I like playing CF
// 當return一個對象時,打印出undefined。其他情況指向函數(shù)的實例。



針對上面一大堆的代碼和解釋是不是對this指向有點頭疼呢,當然上面的都是在函數(shù)體內(nèi)的,還有其他情況的this指向這里沒說。
下面只是簡單的列舉
規(guī)律1 函數(shù)圓括號直接調(diào)用 函數(shù)上下文為window
規(guī)律2 函數(shù)作為對象的方法打點調(diào)用 函數(shù)上下文就是這個對象
規(guī)律3 函數(shù)作為事件的處理函數(shù) 函數(shù)上下文就是出發(fā)這個事件的對象
規(guī)律4 定時器調(diào)用函數(shù) 函數(shù)上下文為window
規(guī)律5 數(shù)組存放的函數(shù) 被數(shù)組索引調(diào)用 this就是這個數(shù)組
其實這五個規(guī)律前四個都涉及過,就是第五個沒有接觸過

function fun() {
        console.log(this)
}
    var arr=[fun,"a","a"];
    arr[0]();



其實仔細總結(jié),如果this在函數(shù)里面,那么它指向的是“函數(shù)執(zhí)行后”的上一級調(diào)用對象一直適用。



作者:Vam的金豆之路

主要領(lǐng)域:前端開發(fā)

我的微信:maomin9761

微信公眾號:前端歷劫之路