我理解的this

一直以來,對(duì)this的指向問題一直沒有好好理解沙热,最近得空叉钥,趕緊惡補(bǔ)一下。

1篙贸、涵義

this是什么投队?

簡(jiǎn)單說,關(guān)鍵字“this”指向當(dāng)前代碼運(yùn)行時(shí)的對(duì)象(當(dāng)前運(yùn)行時(shí)調(diào)用該屬性或方法的對(duì)象)

this是在函數(shù)調(diào)用過程中設(shè)置的

例子:

function fn() {
    return this.name;
}

let a = {
    name: '小明',
    who: fn
}

let b = a.who;
console.log(a.who());  //this指向a爵川,當(dāng)前who方法是被a調(diào)用
console.log(b()); //this指向window敷鸦,當(dāng)前b處于全局環(huán)境下,this.b === window.b寝贡,所以this指向window

2扒披、this使用環(huán)境

全局上下文

在全局上下文環(huán)境中,this指向window對(duì)象

// 在瀏覽器中, window 對(duì)象同時(shí)也是全局對(duì)象:
console.log(this === window); // true
let a = 1;
console.log(window.a); //1
this.b = 2;
console.log(window.b); //2
console.log(b); //2

函數(shù)上下文

在函數(shù)內(nèi)部圃泡,this的值取決于函數(shù)被調(diào)用的方式碟案。

例子:

function fn() {
    return this.name;
}

let a = {
    name: '小明',
    who: fn
}

let b = {
    name: '小紅',
    who: fn,
    c: {
        d: fn
    }
}


console.log(a.who()); //this指向a
console.log(b.who()); //this指向b
console.log(fn()); //this指向window
console.log(b.c.d()); //this指向b.c,為什么不是指向b呢颇蜡?那是因?yàn)閠his總是指向直接調(diào)用它的最近的對(duì)象价说,this只會(huì)向上繼承最近的一層,不會(huì)繼承更上面的層风秤;
let h = b.c.d;
h(); //此時(shí)this指向window鳖目,因?yàn)閔處于全局對(duì)象中

再看一個(gè)例子:

let a = {
    b () {
        console.log(this);
        let c = function () {
            console.log(this);
        }();
    }
}
a.b();
這兩個(gè)this分別指向什么呢?
//第一個(gè)this指向a
//第二個(gè)this指向window

為什么會(huì)這樣呢缤弦?
就如開頭所說的:在函數(shù)內(nèi)部领迈,this的值取決于函數(shù)被調(diào)用的方式。

上面例子的函數(shù)可以看成如下的變體:

let d = function () {
        console.log(this);
    }
let a = {
    b () {
        console.log(this);
        let c = d();//此時(shí),d相當(dāng)于是被window調(diào)用狸捅,所以this此時(shí)指向window
    }
}
a.b();

那如果我們還是要堅(jiān)持第一種寫法衷蜓,那可以對(duì)this事先賦予一個(gè)變量來保存

let a = {
    b () {
        console.log(this);
        let self = this;
        let c = function () {
            console.log(self);
        }();
    }
}
a.b(); //這樣this的值就不會(huì)被改變
箭頭函數(shù)下的this
let a = {
    b () {
        console.log(this);
        let c = () => {
            console.log(this);
        };
        return c;
    }
}
a.b(); // 第一個(gè)this指向a
a.b()(); // 兩個(gè)this都指向a
//兩個(gè)this都綁定到a,這與非箭頭函數(shù)的綁定結(jié)果完成不一樣薪贫。
//這是因?yàn)楫?dāng)使用箭頭函數(shù)時(shí)恍箭,this自動(dòng)綁定到執(zhí)行上下文的外層函數(shù)上
let f = a.b;
f()(); //此時(shí)this指向window,因?yàn)閠his是在執(zhí)行的時(shí)候設(shè)置瞧省。這時(shí)候的f是被window調(diào)用扯夭,所以this指向window;
let f = a.b(); //此時(shí)鞍匾,this指向a交洗。a.b函數(shù)已經(jīng)被調(diào)用,所以this此時(shí)已經(jīng)綁定到a上橡淑;
f(); //此時(shí)的this綁定到哪里呢构拳?沒錯(cuò),還是在a上梁棠,這是因?yàn)榧^函數(shù)中this的值已經(jīng)被綁定到外層函數(shù)上置森。

this的綁定方法:call、apply符糊、bind

使用call凫海,或者apply方法可以指定this在執(zhí)行上下文的指向

call與apply的作用相同,它們的區(qū)別在于接受參數(shù)的方式不一樣男娄。call()接受的參數(shù)以列表的形式傳參行贪,而apply接受的參數(shù)以數(shù)組的方式傳參

例子:call、apply方法
function sum(b) {
    return this.a + b;
}
let sum1 = {a: 1};
sum.call(sum1, 2); //3 this綁定到sum1
sum.apply(sum1, [2]); //3 this綁定到sum1
例子:bind方法

ES6新增了綁定this的bind()方法模闲,調(diào)動(dòng)fn.bind(obj)方法建瘫,會(huì)創(chuàng)建一個(gè)與fn具有相同函數(shù)體和作用域的函數(shù), 同時(shí)this將永久地被綁定到指定的obj對(duì)象上。

function fn() {
    return this.a;
}
let obj = {
    a: 'binded'
}
let bind1 = fn.bind(obj);
console.log(bind1()); //binded
let bind2 = bind1.bind({a: 'binded2'});
console.log(bind2); //binded

下面兩種環(huán)境中的this尸折,就是我們經(jīng)常使用的啰脚,略過啦

構(gòu)造函數(shù)中的this

構(gòu)造函數(shù)中的this指向new出來的對(duì)象(構(gòu)造的新對(duì)象)

事件處理函數(shù)中的this

當(dāng)函數(shù)被用作事件處理函數(shù)時(shí),this指向當(dāng)前觸發(fā)的DOM對(duì)象

例子:

<button onclick="alert(this.tagName)">
  Show this
</button>
// this指向當(dāng)前target:button元素
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翁授,一起剝皮案震驚了整個(gè)濱河市拣播,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌收擦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谍倦,死亡現(xiàn)場(chǎng)離奇詭異塞赂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)昼蛀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門宴猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圆存,“玉大人,你說我怎么就攤上這事仇哆÷僬蓿” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵讹剔,是天一觀的道長(zhǎng)油讯。 經(jīng)常有香客問我,道長(zhǎng)延欠,這世上最難降的妖魔是什么陌兑? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮由捎,結(jié)果婚禮上兔综,老公的妹妹穿的比我還像新娘。我一直安慰自己狞玛,他們只是感情好软驰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著心肪,像睡著了一般锭亏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒙畴,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天贰镣,我揣著相機(jī)與錄音,去河邊找鬼膳凝。 笑死碑隆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹬音。 我是一名探鬼主播上煤,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼著淆!你這毒婦竟也來了劫狠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤永部,失蹤者是張志新(化名)和其女友劉穎独泞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苔埋,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懦砂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荞膘。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罚随,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羽资,到底是詐尸還是另有隱情淘菩,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布屠升,位于F島的核電站潮改,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弥激。R本人自食惡果不足惜进陡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望微服。 院中可真熱鬧趾疚,春花似錦、人聲如沸以蕴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丛肮。三九已至赡磅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宝与,已是汗流浹背焚廊。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留习劫,地道東北人咆瘟。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像诽里,于是被迫代替她去往敵國(guó)和親袒餐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. this之謎 在JavaScript中谤狡,this是當(dāng)前執(zhí)行函數(shù)的上下文灸眼。因?yàn)镴avaScript有4種不同的...
    百里少龍閱讀 996評(píng)論 0 3
  • 函數(shù)和對(duì)象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語(yǔ)言來說都是核心的概念墓懂。通過函數(shù)可以封裝任意多條語(yǔ)句焰宣,而且...
    道無虛閱讀 4,560評(píng)論 0 5
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評(píng)論 0 4
  • 安楠恍惚間聽見一個(gè)聲音:“七橙,你先回去吧捕仔,告訴父皇宛徊,我一個(gè)月以后佛嬉,我自己回去逻澳≌⑻欤” 七橙有些顧慮:“這……?...
    妖精芥末油閱讀 314評(píng)論 0 0
  • 沉睡的太陽(yáng),背負(fù)著啟明的希望瓤逼,在我醒來的這片黑色大地上笼吟,穿過高山雨林,終沒有將榮耀的光芒灑落在支離破碎的身上霸旗,只留...
    點(diǎn)燃回憶閱讀 377評(píng)論 1 0