this詳解

this釋義

this翻譯為上下文踢步,每次我看到這個(gè)解釋都會(huì)產(chǎn)生一種迷糊的感覺姻蚓,也不知道是哪位大神第一個(gè)把this翻譯成這個(gè)意思朵耕,反正猜憎,在第一次看到的時(shí)候元莫,很難了解到this真正的意思卵凑。做了兩年前端弄屡,也經(jīng)常查閱一些與this有關(guān)的資料昼浦,我是贊成把this解釋為指向當(dāng)前執(zhí)行的環(huán)境,當(dāng)然竭沫,這個(gè)“當(dāng)前”經(jīng)常會(huì)發(fā)生不可預(yù)知的變化燥翅,不過(guò)this指代執(zhí)行環(huán)境應(yīng)該是沒有問(wèn)題的。

現(xiàn)在來(lái)看看this具體指向吧蜕提。

this指向

  • 作為對(duì)象的方法調(diào)用
  • 作為普通函數(shù)調(diào)用
  • 構(gòu)造器調(diào)用
  • Function.prototype.call或者Function.prototype.apply調(diào)用

1.作為對(duì)象的方法調(diào)用

當(dāng)函數(shù)作為對(duì)象內(nèi)的一個(gè)方法被調(diào)用的時(shí)候森书,this指向擁有該方法的對(duì)象

var obj = {
    a : 1,
    getA : function(){
        alert(this === obj)//輸出:true
        alert(this.a)//輸出:1
    }
};
obj.getA();

2.作為普通函數(shù)調(diào)用

當(dāng)函數(shù)不作為對(duì)象的一個(gè)方法時(shí)谎势,即常說(shuō)的普通函數(shù)方式凛膏,這個(gè)時(shí)候,this指向全局對(duì)象window(在瀏覽器的javascript環(huán)境中)脏榆。

window.name = 'globalName';

var getName = function(){
    return this.name
};

console.log(getName());//輸出:globalName

或者:

window.name = 'globalName';

var myObj = {
    name : 'jack',
    getName : function(){
        return this.name;
    }
}

var getName = myObj.getName;
console.log(getName());//輸出:globalName
console.log(myObj.getName());//輸出:jack
console.log(myObj.getName);//輸出:function(){return this.name;}//this->window

3.構(gòu)造器調(diào)用

javascript中沒有類猖毫,不過(guò)可以從構(gòu)造器中創(chuàng)建對(duì)象,同時(shí)也一樣提供了new運(yùn)算符须喂,這樣使得構(gòu)造器看起來(lái)很像一個(gè)類吁断。

除了js自帶的一些內(nèi)置函數(shù),大部分js函數(shù)都可以當(dāng)作構(gòu)造器使用坞生。構(gòu)造器外表看起來(lái)跟普通函數(shù)一模一樣胯府,它們的區(qū)別在于被調(diào)用的方式,當(dāng)用new運(yùn)算符調(diào)用函數(shù)時(shí)恨胚,該函數(shù)會(huì)返回一個(gè)對(duì)象骂因,通常情況下,構(gòu)造器的this就指向返回的這個(gè)對(duì)象赃泡。如:

var MyClass = function(){
    this.name = 'jack',
};

var obj = new MyClass();
console.log(obj.name);//輸出:jack //this->obj

但是寒波,如果構(gòu)造器顯式的返回一個(gè)對(duì)象,this則會(huì)指向返回的這個(gè)對(duì)象升熊,而不是我們之前期待的this

var MyClass = function(){
    this.name = 'jack';
    return {
        name : 'lily'
    }
};

var obj = new MyClass();
console.log(obj.name);//輸出:lily

如果不顯式的返回任何數(shù)據(jù)俄烁,或者返回的不是一個(gè)對(duì)象,就不會(huì)出現(xiàn)上述的問(wèn)題:

var MyClass = function(){
    this.name = 'jack';
    return 'lily';//返回的是一個(gè)string類型
};

var obj = new MyClass();
console.log(obj.name);//輸出:jack

4.Function.prototype.call或者Function.prototype.apply調(diào)用

跟普通函數(shù)調(diào)用相比级野,使用Function.prototype.call或者Function.prototype.apply可以動(dòng)態(tài)的改變this的指向:

var obj1 = {
    name : 'jack',
    getName : function(){
        return this.name;
    }
};

var obj2 = {
    name : 'lily'
};

console.log(obj1.getName());//輸出:jack
console.log(obj1.getName.call(obj2));//輸出:lily //改變getName()里面this

寫在最后

callapply方法是javascript的特色页屠,作為一個(gè)真正的js程序員,熟練使用這兩個(gè)方法是必要的條件之一蓖柔。下次詳細(xì)的說(shuō)說(shuō)兩個(gè)方法辰企。

ps: 大部分內(nèi)容參考JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐這本書,本人也正在學(xué)習(xí)這本書的知識(shí)况鸣,寫下這些就當(dāng)作做筆記了牢贸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市镐捧,隨后出現(xiàn)的幾起案子潜索,更是在濱河造成了極大的恐慌臭增,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹习,死亡現(xiàn)場(chǎng)離奇詭異誊抛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)整陌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門芍锚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蔓榄,你說(shuō)我怎么就攤上這事并炮。” “怎么了甥郑?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵逃魄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我澜搅,道長(zhǎng)伍俘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任勉躺,我火速辦了婚禮癌瘾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饵溅。我一直安慰自己妨退,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布蜕企。 她就那樣靜靜地躺著咬荷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轻掩。 梳的紋絲不亂的頭發(fā)上幸乒,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音唇牧,去河邊找鬼罕扎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丐重,可吹牛的內(nèi)容都是我干的腔召。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼弥臼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宴咧!你這毒婦竟也來(lái)了根灯?” 一聲冷哼從身側(cè)響起径缅,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掺栅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纳猪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氧卧,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年氏堤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沙绝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鼠锈,死狀恐怖闪檬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情购笆,我是刑警寧澤粗悯,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站同欠,受9級(jí)特大地震影響样傍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铺遂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一衫哥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧襟锐,春花似錦撤逢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捞蚂,卻和暖如春妇押,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姓迅。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工敲霍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丁存。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓肩杈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親解寝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扩然,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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

  • 不論是面向?qū)ο螅€是基于對(duì)象的語(yǔ)言聋伦,都會(huì)有this夫偶,我更喜歡叫他this指針界睁,如果你不理解指針,認(rèn)為它是個(gè)引用也無(wú)...
    faremax閱讀 680評(píng)論 2 1
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品兵拢,去做同樣的事情翻斟,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 7,771評(píng)論 2 17
  • 英文原文地址:All this翻譯:姜樂(lè)衣 全局作用域下的this 在瀏覽器中说铃,當(dāng)this處于全局作用域時(shí)访惜,thi...
    姜樂(lè)衣閱讀 3,827評(píng)論 0 5
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,237評(píng)論 0 4
  • 多閱讀 廣交賢友 樹立更大的目標(biāo)
    紅房子and西餐廳閱讀 192評(píng)論 0 0