#JS續(xù):3.1 this的指向

前言

看了3.0 this的前置了解堰酿,總算能知道如何判斷this的指向了良狈,那么下面的知識(shí)也不難理解了徒像。

總結(jié)

  • 作為普通函數(shù)黍特,this指向window。
  • 構(gòu)造器調(diào)用锯蛀,this指向返回的這個(gè)對(duì)象灭衷。
  • 當(dāng)函數(shù)作為對(duì)象的方法被調(diào)用時(shí),this就會(huì)指向該對(duì)象旁涤。
  • 箭頭函數(shù) 箭頭函數(shù)的this綁定看的是this所在函數(shù)定義在哪個(gè)對(duì)象下翔曲,就綁定哪個(gè)對(duì)象。如果有嵌套的情況劈愚,則this綁定到最近的一層對(duì)象上

箭頭函數(shù)this的原理

this指向的固定化瞳遍,并不是因?yàn)榧^函數(shù)內(nèi)部有綁定this的機(jī)制,實(shí)際原因是箭頭函數(shù)根本沒(méi)有自己的this菌羽,導(dǎo)致內(nèi)部的this就是外層代碼塊的this掠械。正是因?yàn)樗鼪](méi)有this,所以也就不能用作構(gòu)造函數(shù)注祖。

怎么改變this的指向呢猾蒂?
1.使用es6的箭頭函數(shù);

2.在函數(shù)內(nèi)部使用that = this氓轰;

3.使用apply婚夫,call浸卦,bind署鸡;
4.new實(shí)例化一個(gè)對(duì)象

bind,apply,call的區(qū)別

通過(guò)apply和call改變函數(shù)的this指向,他們兩個(gè)函數(shù)的第一個(gè)參數(shù)都是一樣的表示要改變指向的那個(gè)對(duì)象限嫌,第二個(gè)參數(shù)靴庆,apply是數(shù)組,而call則是arg1,arg2...這種形式怒医。bind一個(gè)是返回一個(gè)函數(shù)炉抒,并不會(huì)立即執(zhí)行第二個(gè)是帶參數(shù)(第一個(gè)參數(shù)要指向的this,后面的的參數(shù)用來(lái)傳遞

正文

一稚叹、幾種指向

1焰薄、直接作為普通函數(shù)去調(diào)用拿诸,this指向window

在全局作用域下函數(shù)直接被調(diào)用this綁定到全局對(duì)象,如調(diào)用window.fn1(this)塞茅,this就是全局對(duì)象

console.log(this);

function fn1(){
    console.log(this);
}

fn1();

2亩码、函數(shù)嵌套含有this的內(nèi)部函數(shù),執(zhí)行父函數(shù)時(shí)野瘦,this指向window

函數(shù)嵌套產(chǎn)生的內(nèi)部函數(shù)的this不是其父函數(shù)描沟,而是如fn0()直接調(diào)用函數(shù)里的fn(),也是直接調(diào)用this鞭光,this指向window吏廉。

function fn0(){
    function fn(){
        console.log(this);
    }
    fn()
}
fn0()

3、this在函數(shù)setTimeout惰许、setInterval中執(zhí)行席覆,this指向window

當(dāng)執(zhí)行第一個(gè)this時(shí),它指向當(dāng)前document元素汹买;當(dāng)執(zhí)行第二個(gè)this時(shí)娜睛,函數(shù)setTimeout、setInterval中的this指向window卦睹。

document.addEventListener('click', function(e){
    console.log(this);
    setTimeout(function(){
        console.log(this);
    }, 200);
}, false);

4畦戒、作為構(gòu)造函數(shù)調(diào)用,this指向創(chuàng)建的這個(gè)對(duì)象

構(gòu)造函數(shù)结序,并不直接調(diào)用this(直接調(diào)用this則是全局變量)障斋,先new一個(gè)函數(shù)創(chuàng)建一個(gè)實(shí)例,同時(shí)設(shè)置這個(gè)實(shí)例的proto屬性指向prototype屬性徐鹤,執(zhí)行當(dāng)前函數(shù)垃环,執(zhí)行中當(dāng)前的this
第一個(gè)this此時(shí)代表剛剛創(chuàng)建的這個(gè)對(duì)象(實(shí)例),然后賦值給變量p1返敬、p2遂庄、p3,在構(gòu)造函數(shù)原型上添加的printName劲赠,執(zhí)行函數(shù)時(shí)輸出的this也代表這剛剛創(chuàng)建并調(diào)用的這個(gè)對(duì)象(實(shí)例)

function Person(name){
    this.name = name;
}
Person.prototype.printName = function(){
    console.log(this.name);
};

var p1 = new Person('Byron');
var p2 = new Person('Casper');
var p3 = new Person('Vincent');

p1.printName();
p2.printName();
p3.printName();

5涛目、當(dāng)函數(shù)作為對(duì)象方法被調(diào)用,this指向該對(duì)象

首先obj1.fn被調(diào)用凛澎,fn前面有一個(gè)對(duì)象引用霹肝,所以首先輸出的是對(duì)象 obj1,那么this 被自然綁定到該對(duì)象塑煎,第一個(gè)輸出便是obj1沫换,fn 中的“this”是指向全局對(duì)象,因此第二個(gè)被輸出到控制臺(tái)的是全局對(duì)象最铁。

var obj1 = {
    name: 'Byron',
    fn : function(){
        console.log(this);
    }
};

obj1.fn();
//{name: "Byron", fn: ?}和全局對(duì)象

var fn2 = obj1.fn;
fn2()

假設(shè)var fn2 = obj1.fn;此時(shí)fn2被調(diào)用讯赏,所以下一個(gè)輸出的結(jié)果也是全局變量
此時(shí)fn2和fn實(shí)質(zhì)上是對(duì)同一個(gè)函數(shù)的引用垮兑,只是調(diào)用的綁定規(guī)則不一樣。

6漱挎、DOM對(duì)象綁定事件甥角,this指向事件源DOM對(duì)象

在事件處理程序中this代表事件源DOM對(duì)象(低版本IE有bug,指向了window)识樱,但是在 setTimeout函數(shù)中如果沒(méi)有提前聲明this的話嗤无,this則指向window。如this仍代表事件源DOM對(duì)象怜庸,那么就需要將this 賦值給一個(gè)新變量

document.addEventListener('click', function(e){
    console.log(this);
    var _document = this;
    setTimeout(function(){
        console.log(this);
        console.log(_document);
    }, 200);
}, false);

7当犯、Function.prototype.bind

bind 作為任何函數(shù)的一個(gè)原型方法,都能找到割疾。bind嚎卫,返回一個(gè)新函數(shù),并且使函數(shù)內(nèi)部的this為傳入的第一個(gè)參數(shù)

var name = 'global'
var App {
      name ='app'
      sayName  = function(){
      console.log(this.name)
   }
}
App.sayName()
//app

當(dāng)調(diào)用App.sayName()時(shí)宏榕,實(shí)際就是調(diào)用函數(shù)function拓诸,輸出this.name,那么this代表的就是App里面的name,即app
假設(shè)繼續(xù)執(zhí)行:

var name = 'global'
var App {
      name ='app'
      sayName  = function(){
      console.log(this.name)
   }
}
var obj1 ={
    name:'nick'
}
App.sayName() //app
App.sayName.bind(window)()  //global
App.sayName.bind(obj1)()  // nick

App.sayName.bind(window)()麻昼,函數(shù).bind的作用返回一個(gè)新的函數(shù)奠支,函數(shù)中若有this,那么則作為bind的第一個(gè)對(duì)象

App.sayName.bind(參數(shù))執(zhí)行后返回一個(gè)函數(shù)(這里相當(dāng)于生成了一個(gè)新的函數(shù))抚芦,而這里傳遞的參數(shù)倍谜,如window或者再聲明一個(gè)變量,this就是這個(gè)傳遞的參數(shù)叉抡,那么繼續(xù)執(zhí)行之后尔崔,實(shí)質(zhì)上就是執(zhí)行 sayName里面的函數(shù)體,此時(shí)this === 參數(shù) 褥民,則會(huì)輸出對(duì)應(yīng)的屬性值

待續(xù)...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末季春,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子消返,更是在濱河造成了極大的恐慌载弄,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侦副,死亡現(xiàn)場(chǎng)離奇詭異侦锯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)秦驯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挣棕,“玉大人译隘,你說(shuō)我怎么就攤上這事亲桥。” “怎么了固耘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵题篷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我厅目,道長(zhǎng)番枚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任损敷,我火速辦了婚禮葫笼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拗馒。我一直安慰自己路星,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布诱桂。 她就那樣靜靜地躺著洋丐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挥等。 梳的紋絲不亂的頭發(fā)上友绝,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音肝劲,去河邊找鬼九榔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涡相,可吹牛的內(nèi)容都是我干的哲泊。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼催蝗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼切威!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起丙号,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤先朦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后犬缨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體喳魏,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年怀薛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刺彩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖创倔,靈堂內(nèi)的尸體忽然破棺而出嗡害,到底是詐尸還是另有隱情,我是刑警寧澤畦攘,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布霸妹,位于F島的核電站,受9級(jí)特大地震影響知押,放射性物質(zhì)發(fā)生泄漏叹螟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一台盯、第九天 我趴在偏房一處隱蔽的房頂上張望罢绽。 院中可真熱鬧,春花似錦爷恳、人聲如沸有缆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棚壁。三九已至,卻和暖如春栈虚,著一層夾襖步出監(jiān)牢的瞬間袖外,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工魂务, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萄喳,地道東北人亲族。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓煮甥,卻偏偏與公主長(zhǎng)得像乞榨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孤紧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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

  • 1.概念 在JavaScript中豺裆,this 是指當(dāng)前函數(shù)中正在執(zhí)行的上下文環(huán)境,因?yàn)檫@門(mén)語(yǔ)言擁有四種不同的函數(shù)調(diào)...
    BluesCurry閱讀 1,135評(píng)論 0 2
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券押蚤,享受所有官網(wǎng)優(yōu)惠蔑歌,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,926評(píng)論 15 54
  • 函數(shù)和對(duì)象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門(mén)語(yǔ)言來(lái)說(shuō)都是核心的概念揽碘。通過(guò)函數(shù)可以封裝任意多條語(yǔ)句次屠,而且...
    道無(wú)虛閱讀 4,586評(píng)論 0 5
  • 我都記不清什么時(shí)候加入的007园匹,只能查詢到加入007已經(jīng)230天。當(dāng)初加入007也是認(rèn)識(shí)到寫(xiě)作的重要性帅矗,鍛煉自己總...
    七年新生閱讀 112評(píng)論 0 0
  • 音樂(lè)之于我偎肃,本來(lái)是八竿子打不著的煞烫。只因一些冥冥之中的偶然浑此,我接觸到了音樂(lè)。禮記講滞详,禮之用凛俱,和為貴。和者料饥,和諧也蒲犬。西...
    withism閱讀 5,239評(píng)論 0 0