this

當(dāng)一個(gè)函數(shù)被調(diào)用時(shí)溯祸,會(huì)創(chuàng)建一個(gè)活動(dòng)記錄(執(zhí)行上下文)肢专。這個(gè)記錄會(huì)包括函數(shù)在哪里被調(diào)用(調(diào)用棧)、函數(shù)的調(diào)用方式焦辅、傳入的參數(shù)等信息博杖。 this 就是這個(gè)記錄的一個(gè)屬性,會(huì)在函數(shù)執(zhí)行的過程中用到筷登。

隨著函數(shù)使用場(chǎng)合的不同剃根,this的值會(huì)發(fā)生變化。但是有一個(gè)總的原則前方,那就是this指的是狈醉,調(diào)用函數(shù)的那個(gè)對(duì)象。

一惠险、作為函數(shù)調(diào)用

函數(shù)直接調(diào)用時(shí)的this
console.log(this);  //  window

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

fn(); // 在函數(shù)被直接調(diào)用時(shí)this綁定到全局對(duì)象苗傅。在瀏覽器中,window 就是該全局對(duì)象

內(nèi)部函數(shù)的this

函數(shù)嵌套產(chǎn)生的內(nèi)部函數(shù)的this不是其父函數(shù)班巩,仍然是全局變量

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

fn(); //  window  

改寫一下:

function fn(){
    console.log('這是fn')
    console.log(this);   //  window
    function fn1(){
        console.log('這是fn1')
        console.log(this);  //   window
      function   fn2() {
           console.log('這是fn2')
           console.log(this);  // 依舊是window
         }
       fn2 ()
    }
    fn1();
}

fn();  
setTimeout渣慕、setInterval 中的this
function fn(){
    console.log(this);   //  window
    setTimeout(function(){
        console.log(this);  // window
    }, 200);
}

fn()

二、 作為構(gòu)造函數(shù)調(diào)用

作為構(gòu)造函數(shù)調(diào)用時(shí),this指向?qū)嵗龑?duì)象

function Cat(name){
    this.name = name;
}
Cat.prototype.sayName = function(){
    console.log(this.name);
};

var p1 = new Cat('Munchkin');
p1.sayName();  // Munchkin

三逊桦、作為對(duì)象方法調(diào)用

  • 隱式綁定眨猎, 直接調(diào)用 cat.fn()
var cat = {
    name: 'Munchkin',
    fn : function(){
        console.log(this);
    }
};
cat.fn(); // 指向調(diào)用函數(shù)的對(duì)象 cat 

對(duì)象屬性引用鏈中只有上一層或者說最后一層在調(diào)用位置中起作用。

  • 常見陷阱 ( “隱式丟失”): 將cat.fn 賦值給其他對(duì)象再調(diào)用
var fn2 = cat.fn;

fn2(); //  window
  • 將對(duì)象方法作為參數(shù)傳遞給函數(shù)强经,然后調(diào)用函數(shù)
function foo(){
  console.log(this.a)
}
function doFoo(fn) {
  console.log(fn)
  fn(); // <-- 調(diào)用位置!
}
var obj = {
  a: 2,
  foo: foo
}
var a  = "oops, global";
doFoo(obj.foo); //  "oops, global"

參數(shù)傳遞其實(shí)就是一種隱式賦值睡陪,因此我們傳入函數(shù)時(shí)也會(huì)被隱式賦值(與上個(gè)例子類似)。

四匿情、 DOM對(duì)象綁定事件

在事件處理程序中this代表事件源DOM對(duì)象(低版本IE有bug兰迫,指向了window)

<body>
  <button>click</button>
  
  <script>
    let btn = document.querySelector('button');
    btn.addEventListener('click', function(e){
      console.log(this);  //   <button>click</button>
      var _document = this;
      setTimeout(function(){
          console.log(this);  //  window
          console.log(_document);  //  <button>click</button>
      }, 200);
  }, false);
  </script>
</body>

五、使用 call ,apply ,bind 改變this 指向(顯式綁定)

Function.prototype.call

fn.call(context, param1, param2...)

Function.prototype.apply

fn.apply(context, paramArray)

Function.prototype.bind

bind码秉,返回一個(gè)新函數(shù)逮矛,并且使函數(shù)內(nèi)部的this為傳入的第一個(gè)參數(shù)

var fn3 = obj1.fn.bind(obj1);
fn3();
三者比較

共同點(diǎn)

  • 都可以改變 this 指向,第一個(gè)參數(shù)都是希望設(shè)置的this對(duì)象

不同點(diǎn)

  • call 和 apply的不同之處在于call方法接收參數(shù)列表转砖,而apply接收參數(shù)數(shù)組; - call 和 apply 都是直接調(diào)用函數(shù)鲸伴,而bind 是返回一個(gè)改變了this 指向的新函數(shù)府蔗,供后面調(diào)用(不是直接調(diào)用)

七、 關(guān)于 this 的題目

var name = 'window'

var person1 = {
  name: 'person1',
  show1: function() {
    console.log(this.name)
  },
  show2: () => console.log(this.name),
  show3: function() {
    return function() {
      console.log(this.name)
    }
  },
  show4: function() {
    return () => console.log(this.name)
  }
}
var person2 = {
  name: 'person2'
}

以下各輸出什么:

person1.show1() 
person1.show1.call(person2)

 person1.show2() 
 person1.show2.call(person2)

 person1.show3()()
 person1.show3().call(person2)
 person1.show3.call(person2)()

person1.show4()()
person1.show4().call(person2)
person1.show4.call(person2)()

參考:

  • 《你不知道的JS》 P82~ P101
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汞窗,一起剝皮案震驚了整個(gè)濱河市姓赤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仲吏,老刑警劉巖不铆,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異裹唆,居然都是意外死亡誓斥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門许帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劳坑,“玉大人,你說我怎么就攤上這事成畦【喾遥” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵循帐,是天一觀的道長(zhǎng)框仔。 經(jīng)常有香客問我,道長(zhǎng)拄养,這世上最難降的妖魔是什么离斩? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上捐腿,老公的妹妹穿的比我還像新娘纵朋。我一直安慰自己,他們只是感情好茄袖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布操软。 她就那樣靜靜地躺著,像睡著了一般宪祥。 火紅的嫁衣襯著肌膚如雪聂薪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天蝗羊,我揣著相機(jī)與錄音藏澳,去河邊找鬼。 笑死耀找,一個(gè)胖子當(dāng)著我的面吹牛翔悠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播野芒,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蓄愁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了狞悲?” 一聲冷哼從身側(cè)響起撮抓,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摇锋,沒想到半個(gè)月后丹拯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荸恕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年乖酬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戚炫。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剑刑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出双肤,到底是詐尸還是另有隱情施掏,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布茅糜,位于F島的核電站七芭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蔑赘。R本人自食惡果不足惜狸驳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一预明、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耙箍,春花似錦撰糠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汁针,卻和暖如春术辐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背施无。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工辉词, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猾骡。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓瑞躺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卓练。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隘蝎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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

  • 參考《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》 this 跟別的語言大相徑庭的是顽悼,JavaScript的this總...
    16manman閱讀 573評(píng)論 0 0
  • 涵義 this關(guān)鍵字是一個(gè)非常重要的語法點(diǎn)。毫不夸張地說几迄,不理解它的含義蔚龙,大部分開發(fā)任務(wù)都無法完成。 首先映胁,thi...
    許先生__閱讀 556評(píng)論 0 4
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持解孙,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券坑填,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,926評(píng)論 15 54
  • 1. this之謎 在JavaScript中弛姜,this是當(dāng)前執(zhí)行函數(shù)的上下文脐瑰。因?yàn)镴avaScript有4種不同的...
    百里少龍閱讀 1,005評(píng)論 0 3
  • 生于憂患。 簡(jiǎn)直被我的智商深深打敗了廷臼。人都把你刪了你還傻呵呵的以為考駕照考證忙沒時(shí)間理你苍在。終于一切都結(jié)束了绝页,開始的...
    和太陽肩并肩閱讀 225評(píng)論 0 1