30分鐘讓前端學(xué)會(huì)this(紐約的老鄭原創(chuàng))

那么,什么是this? 我一下子回到了上初中的時(shí)候:

問:who is that ?
答:This is Tom speaking

在英語里面,this是一個(gè)代詞,用來指敘述中的人或事物,即指前面提到過的人或事物或下文提及的事物。
OK,如果你的棒(zha)棒(zha)的英語能理解到這個(gè)份上,我還能說啥,點(diǎn)擊右上角那個(gè)像X一樣的叉叉,慢走,不送。
一個(gè)東西我們?nèi)绻诓恢朗巧兜臅r(shí)候說再多的廢話也是徒勞,我們還是直接看代碼吧:

var obj={
    a:1,
    getA:function(){
        console.log(this==obj);
        console.log(this.a);
    }
};

obj.getA();

上面的代碼我們直接的看,OK,有一個(gè)對(duì)象叫obj,調(diào)用了這個(gè)對(duì)象的一個(gè)方法叫g(shù)etA,好的,看getA方法里面,赤裸裸的有一個(gè)關(guān)鍵詞叫g(shù)et有沒有,這個(gè)this是啥意思呢?
聽好了,this法則第一條:

對(duì)長(zhǎng)得像這樣的:

XXX.fn();

這個(gè)fn的作用域環(huán)境里面如果你用上了this,這個(gè)this指的就是這個(gè)XXX。

OK,于是,有人就問了,teacher,請(qǐng)問下面這個(gè)時(shí)候,this代表的為啥是window?

var fn = function(){
    console.log(this);
}

這個(gè)嘛,我想用下面的一行代碼來回敬這位同學(xué):

window.fn === fn

OK,我們了解了this了,慢著,這只是大部分情況下this的用法,this也有一些特殊情況我們需要了解的,我們只有掌握了這些特殊情況才可以算真正的掌握了this。

我們復(fù)習(xí)一下對(duì)象的創(chuàng)建方式,我們知道,對(duì)象有二種創(chuàng)建方式,誰說下有哪二種方式創(chuàng)建?(停頓一會(huì)兒)

var obj = {};//字面量
var obj = new Object();

是的,對(duì)象可以用字面量來創(chuàng)建,當(dāng)然,有一種不常用但是確實(shí)也可以用的是用構(gòu)造函數(shù)的方式來創(chuàng)建,那我們就來看一下,在構(gòu)造函數(shù)里這個(gè)this是怎么一個(gè)意思,首先我來寫一個(gè)這樣的構(gòu)造函數(shù):

var Klass = function(){
    this.name = "moyu-edu.com";
}

OK,我們來用一下:

var xiaoMo = new Klass();

這個(gè)工作原理是怎么樣子的呢?
其實(shí)是這樣的:把這個(gè)構(gòu)造函數(shù)里面的this指向的即將創(chuàng)建出來的這個(gè)對(duì)象。
那我們現(xiàn)在知道了,其實(shí)當(dāng)一個(gè)構(gòu)造函數(shù)在執(zhí)行的時(shí)候,里面的this指向的就不再是window了,而是這個(gè)將要?jiǎng)?chuàng)建出來的對(duì)象了。

這是一個(gè)特殊的地方大家要記住,還有一個(gè)特殊的地方要說明一點(diǎn):

函數(shù)內(nèi)部的函數(shù)里的this指向的是window。

為了驗(yàn)證這句話,我們來寫一些代碼:

var obj = {
    fn:function(){
        function fn1(){
            console.log(this);
        }
        fn1();
    }
}
obj.fn();
setTimeout(function(){
    function fn(){
        console.log(this);
    }
},1000);
<style>
    #demo{
        width: 300px;
        height: 300px;
        background-color: pink;
    }
</style>
<div id="demo"></div>
<script>
document.addEventListener("DOMContentLoaded",function(){
    var oDiv = document.getElementById("demo");
    oDiv.onclick = function(){
        console.log(this);
        function fn(){
            console.log(this);
        }
        fn();
    }
},false);
</script>

OK,30分鐘到了,新技能get!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容