javascript中關(guān)于this 的指向問題

一债热、this在函數(shù)調(diào)用時

const fun1 = function () {

? ? ? ? console.log(this);

? ? ? ? const fun2 = function () {

? ? ? ? ? ? console.log(this);

? ? ? ? };

? ? ? ? fun2(); //輸出 Window

? ? };

? ? fun1();? //輸出 Window

然而嚴(yán)格模式下,結(jié)果并不相同挑围;

```'use strict'

? ? const fun1 = function () {

? ? ? ? console.log(this);

? ? ? ? const fun2 = function () {

? ? ? ? ? ? console.log(this);

? ? ? ? };

? ? ? ? fun2(); //輸出 undefined

? ? };

? ? fun1();? //輸出 undefined

?fun1這個函數(shù)是全局的倔喂,默認(rèn)掛載在window對象下铝条,this指向它的調(diào)用者即window,所以輸出window對象席噩,但是在嚴(yán)格模式下班缰,this不允許指向全局變量window,所以輸出為undefined悼枢。

fun2在函數(shù)直接調(diào)用時默認(rèn)指向了全局window鲁捏,實(shí)際上js設(shè)計上的缺陷。正確的方式應(yīng)該是內(nèi)部函數(shù)的this 應(yīng)該綁定到其外層函數(shù)對應(yīng)的對象上萧芙,使用變量替代的方式規(guī)避該問題。

?二假丧、this作為對象方法

const user = {

? ? ? ? userName: '張三',

? ? ? ? age: 18,

? ? ? ? selfIntroduction: function () {

? ? ? ? ? ? const str = 'str 我的名字是:' + this.userName + ",年齡是:" + this.age;

? ? ? ? ? ? console.log(str);//str 我的名字是: 張三,年齡是:18

? ? ? ? ? ? const loop = function () {

? ? ? ? ? ? ? ? console.log('loop 我的名字是:' + this.userName + ",年齡是:" + this.age);

? ? ? ? ? ? };

? ? ? ? ? loop();? ? //loop 我的名字是:undefined,年齡是:undefined

? ? ? ? }

? ? };

user.selfIntroduction();? ?


selfIntroduction()方法的調(diào)用者是user双揪,所以在該方法內(nèi)部this指向了他的父對象user,而loop方法輸里面指向的window包帚,所以才會輸出undefined渔期;所以我嘗試修改下,將方法內(nèi)的this緩存下來渴邦,將loop方法的this指向修改


const user = {

? ? ? ? userName: '張三',

? ? ? ? age: 18,

? ? ? ? selfIntroduction: function () {

? ? ? ? ? ? const str = 'str 我的名字是:' + this.userName + ",年齡是:" + this.age;

? ? ? ? ? ? console.log(str); //str 我的名字是: 張三,年齡是:18

? ? ? ? ? ? const that=this;

? ? ? ? ? ? const loop = function () {

? ? ? ? ? ? ? ? console.log('loop 我的名字是:' + that.userName + ",年齡是:" + that.age);

? ? ? ? ? ? };

? ? ? ? ? ? loop();? ? //loop 我的名字是: 張三,年齡是:18

? ? ? ? }

? ? };

user.selfIntroduction();?


小結(jié):將selfIntroduction()賦值給了全局變量other疯趟,調(diào)用other()方法,other掛載在全局函數(shù)window對象下谋梭,window對象下沒有userName 和 age 這兩個屬性信峻,所以輸出為undefined。第二段代碼瓮床,申明了data對象盹舞,包含了username和age屬性,一般情況下this指向它的調(diào)用者隘庄,data是selfIntroduction()的函數(shù)的調(diào)用者踢步,所以輸出了data的userName和age。

三丑掺、this作為事件觸發(fā)


? ? <div id="btn">請點(diǎn)擊</div>

? ? <script>

? ? const btn=document.getElementById('btn');

? ? ? ? btn.addEventListener('click',function () {

? ? ? ? ? ? console.log(this);?

? ? ? })

? ? </script>

? ? // 輸出? <div id="btn">請點(diǎn)擊</div>

小結(jié):這種情況下this指向了事件的事件源event获印。

四、構(gòu)造函數(shù)

const? fun=function(userName){

? ? ? ? this.userName=userName;

? ? }

? ? const? user=new fun('張三');? ?

? ? console.log(user.userName);? //張三

小結(jié):

new關(guān)鍵字構(gòu)造了一個對象實(shí)例街州,賦值給了user兼丰,所以userName就成為了user對象的屬性玻孟。

五、箭頭函數(shù)和this

const fun1=()=>{

? ? ? ? console.log(this);? //輸出 Window

? ? };

? ? fun1();


const data={

? ? ? ? userName:'張三',

? ? ? ? selfIntroduction:function(){


? ? ? ? ? ? console.log(this);? //輸出 Object {userName: "張三", selfIntroduction: function}


? ? ? ? ? ? const fun2=()=>{


? ? ? ? ? ? ? ? console.log(this);?

? ? ? ? ? ? ? ? //輸出 Object {userName: "張三", selfIntroduction: function}


? ? ? ? ? ? }

? ? ? ? ? ? fun2();

? ? ? ? }

? ? }

? ? data.selfIntroduction();

在箭頭函數(shù)中this指向創(chuàng)建者而不是調(diào)用者地粪,fun1在全局函數(shù)下創(chuàng)建取募,所以this指向window。

而fun2在對象data下創(chuàng)建蟆技,this指向data對象玩敏,所以在func2函數(shù)內(nèi)部this指向data對象,

es6的箭頭函數(shù)的this指向更加完善一些质礼。

?六旺聚、如何改變this的指向

最常見的用來改變this指向的函數(shù),包括call眶蕉、apply砰粹、bind

const func=function(){

? ? console.log(this);

};

func(); //window

func.apply({userName:"張三"}); //輸出 Object {userName: "張三"}


小結(jié):call、apply會將該方法綁定this之后立即執(zhí)行造挽,而bind方法會返回一個可執(zhí)行的函數(shù)碱璃。

七、總結(jié)

經(jīng)過以上的幾個案例饭入,可以總結(jié)出以下幾點(diǎn):

?1. 全局變量默認(rèn)掛載在window對象下嵌器;<br/>

2. 一般情況下this指向它的調(diào)用者;<br/>

3. es6的箭頭函數(shù)中谐丢,this指向創(chuàng)建者爽航,并非調(diào)用者;<br/>

4. 通過call乾忱、apply讥珍、bind可以改改變this的指向。

(PS:關(guān)于call窄瘟、apply衷佃、bind這三者之間的區(qū)別在我的其他博客里有專門的說明。)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寞肖,一起剝皮案震驚了整個濱河市纲酗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌新蟆,老刑警劉巖觅赊,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異琼稻,居然都是意外死亡吮螺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸠补,“玉大人萝风,你說我怎么就攤上這事∽涎遥” “怎么了规惰?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泉蝌。 經(jīng)常有香客問我歇万,道長,這世上最難降的妖魔是什么勋陪? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任贪磺,我火速辦了婚禮,結(jié)果婚禮上诅愚,老公的妹妹穿的比我還像新娘寒锚。我一直安慰自己,他們只是感情好违孝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布刹前。 她就那樣靜靜地躺著,像睡著了一般雌桑。 火紅的嫁衣襯著肌膚如雪腮郊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天筹燕,我揣著相機(jī)與錄音,去河邊找鬼衅鹿。 笑死撒踪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的大渤。 我是一名探鬼主播制妄,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泵三!你這毒婦竟也來了耕捞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤烫幕,失蹤者是張志新(化名)和其女友劉穎俺抽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體较曼,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磷斧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弛饭。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡冕末,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侣颂,到底是詐尸還是另有隱情档桃,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布憔晒,位于F島的核電站藻肄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丛晌。R本人自食惡果不足惜仅炊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澎蛛。 院中可真熱鬧抚垄,春花似錦、人聲如沸谋逻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毁兆。三九已至浙滤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間气堕,已是汗流浹背纺腊。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茎芭,地道東北人揖膜。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像梅桩,于是被迫代替她去往敵國和親壹粟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

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

  • 1宿百、es5和es6的區(qū)別趁仙,說一下你所知道的es6 ECMAScript5,即ES5垦页,是ECMAScript的第五次...
    沒糖_cristalle閱讀 686評論 0 0
  • js經(jīng)典面試題 /* console.log(a) //undefined var a = 12 ...
    A阿a閱讀 588評論 0 0
  • 1雀费、離職多久了 2、大約多久到崗 3痊焊、離這里多遠(yuǎn) 4坐儿、會考慮搬家嗎 5律胀、公司會加班 6、為什么要離職 7貌矿、你們這個...
    臨淵鯨落閱讀 1,228評論 0 1
  • 1.什么是閉包炭菌? 閉包是指有權(quán)訪問另一個函數(shù)作用域的變量的函數(shù)。 說白了逛漫,閉包就是一個函數(shù)黑低,這個函數(shù)能夠訪問其他...
    wudi天閱讀 271評論 0 1
  • 一、cmd終端常用命令 1酌毡、dir 顯示目錄里面的所有文件(包括文件夾和文件) 2克握、cd.. 回到上一級目錄 3、...
    一個想讀書的人閱讀 544評論 0 0