關(guān)于this指向

1 首先this是和執(zhí)行上下文綁定的褐荷,而執(zhí)行上下文分為三種:

(1) 全局執(zhí)行上下文

在全局上下文中打印console.log(this),會發(fā)現(xiàn)最終是window骏掀,所以可以得出結(jié)論:全局執(zhí)行上下文中的this是指向window對象的妖滔。

(2) 函數(shù)執(zhí)行上下文
function foo(){
    console.log(this);
}
foo();

執(zhí)行上邊這段代碼打印出來的也是window抠艾,所以默認情況下調(diào)用一個函數(shù)其執(zhí)行上下文中的this也是指向window的熟掂。

(3) eval執(zhí)行上下文

eval執(zhí)行上下文平時用到的比較少,這里就略過了骡楼。

根據(jù)上邊分析熔号,全局上下文中的this、和默認情況調(diào)用函數(shù)時鸟整,函數(shù)中的this都是指向window對象引镊,下邊我們來看我們是通過什么方式改變this指向的。

2 通過對象調(diào)用方法設(shè)置

    var a = 1
    var obj1 = {
      a:2,
      fn:function(){
        console.log(this.a)
      }
    }
    obj1.fn()//2    

通過打印結(jié)果,我們發(fā)現(xiàn)此時的this指向obj1弟头,結(jié)論:使用對象來調(diào)用其內(nèi)部的一個方法吩抓,該方法的this是指向?qū)ο蟊旧淼?/em>

var a = 1
    var obj1 = {
      a:2,
      fn:function(){
        console.log(this.a)
      }
    }
   var fn2 =  obj1.fn
  fn2();//1

執(zhí)行這段代碼亮瓷,會發(fā)現(xiàn)this又指向了window琴拧。
通過上邊兩個例子對比,我們可以得出以下結(jié)論:
在全局環(huán)境中調(diào)用一個函數(shù)嘱支,函數(shù)內(nèi)部的this指向的是全局的window蚓胸。
通過一個對象來調(diào)用其內(nèi)部的一個方法,該方法執(zhí)行上下文中的this指向?qū)ο蟊旧怼?/em>
this永遠指向調(diào)用它的那個對象除师。

3 通過構(gòu)造函數(shù)設(shè)置

new一個函數(shù)時沛膳,背地里會將創(chuàng)建一個連接到prototype成員的新對象,同時this會被綁定到那個新對象上汛聚。

function Person(name,age){
// 這里的this都指向?qū)嵗?    this.name = name
    this.age = age
    this.sayAge = function(){
        console.log(this.age)
    }
}
var dot = new Person('Dot',2)
dot.sayAge()//2

當new Person()時锹安,js引擎做了以下四件事情:
1 首先創(chuàng)建一個空對象 tempObj;
2 接著用Person.call方法,并將tempObj作為call方法參數(shù)倚舀;
3 然后執(zhí)行Person函數(shù)叹哭,此時的Person函數(shù)執(zhí)行上下文中的this指向了tempObj對象;
4 最后返回tempObj對象
可以用以下代碼理解整個調(diào)用構(gòu)造函數(shù)的過程:

var tempObj= {}
Person.call(tempObj)
return temObj

4 通過apply痕貌、call风罩、bind改變

4.1 applay

applay接收兩個參數(shù),第一個是this的值舵稠,第二個參數(shù)是一個參數(shù)數(shù)組超升。當?shù)谝粋€值為null、undefined時哺徊,this指向window室琢。

var arr = [1,2,3,89,46]
var max = Math.max.apply(null,arr)//89

4.2 call

call的第一個參數(shù)是this的值,后邊傳入的是一個參數(shù)列表落追。當?shù)谝粋€值為null盈滴、undefined時,this指向window轿钠。

var arr = [1, 2, 3, 89, 46]
var max = Math.max.call(null, arr[0], arr[1], arr[2], arr[3], arr[4])//89

4.3 bind

和call很相似雹熬,第一個參數(shù)是this的指向,從第二個參數(shù)開始是接收的參數(shù)列表谣膳。區(qū)別在于bind方法返回值是函數(shù)以及bind接收的參數(shù)列表的使用。

bind返回值是函數(shù)
var obj = {
    name: 'Dot'
}

function printName() {
    console.log(this.name)
}

var dot = printName.bind(obj)
console.log(dot) // function () { … }
dot()  // Dot

bind 方法不會立即執(zhí)行铅乡,而是返回一個改變了上下文 this 后的函數(shù)继谚。而原函數(shù) printName 中的 this 并沒有被改變,依舊指向全局對象 window阵幸。

bind參數(shù)列表的使用
function fn(a, b, c) {
    console.log(a, b, c);
}
var fn1 = fn.bind(null, 'Dot');

fn('A', 'B', 'C');            // A B C
fn1('A', 'B', 'C');           // Dot A B
fn1('B', 'C');                // Dot B C
fn.call(null, 'Dot');      // Dot undefined undefined

call 是把第二個及以后的參數(shù)作為 fn 方法的實參傳進去花履,而 fn1 方法的實參實則是在 bind 中參數(shù)的基礎(chǔ)上再往后排芽世。

5

使用this謹記以下三點:
1 當函數(shù)作為對象方法調(diào)用時,函數(shù)中的this就是該對象诡壁;
2 當函數(shù)正常調(diào)用時济瓢,在嚴格模式下,this值是undefined妹卿,非嚴格模式下this指向的是全局的window旺矾;
3 嵌套函數(shù)中的this不會繼承外層的this值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夺克,一起剝皮案震驚了整個濱河市箕宙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铺纽,老刑警劉巖柬帕,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狡门,居然都是意外死亡陷寝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門其馏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凤跑,“玉大人,你說我怎么就攤上這事尝偎∪幕穑” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵致扯,是天一觀的道長肤寝。 經(jīng)常有香客問我,道長抖僵,這世上最難降的妖魔是什么鲤看? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮耍群,結(jié)果婚禮上义桂,老公的妹妹穿的比我還像新娘。我一直安慰自己蹈垢,他們只是感情好慷吊,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曹抬,像睡著了一般溉瓶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天堰酿,我揣著相機與錄音疾宏,去河邊找鬼。 笑死触创,一個胖子當著我的面吹牛坎藐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哼绑,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼岩馍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凌那?” 一聲冷哼從身側(cè)響起兼雄,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帽蝶,沒想到半個月后赦肋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡励稳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年佃乘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驹尼。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡趣避,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出新翎,到底是詐尸還是另有隱情程帕,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布地啰,位于F島的核電站愁拭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏亏吝。R本人自食惡果不足惜岭埠,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔚鸥。 院中可真熱鬧惜论,春花似錦、人聲如沸止喷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弹谁。三九已至蹦掐,卻和暖如春技羔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卧抗。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鳖粟,地道東北人社裆。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像向图,于是被迫代替她去往敵國和親泳秀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

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

  • 課程前言: 慕課網(wǎng) --圖片預(yù)加載 圖片預(yù)加載的特點: ( 1榄攀、網(wǎng)站的Loading頁 2嗜傅、局部圖片的加載--表情...
    一樹青楓閱讀 3,653評論 0 2
  • 先聲明一個數(shù)組,再創(chuàng)建img檩赢,再放進數(shù)組里吕嘀,不讓它被回收,當設(shè)置src時贞瞒,就會發(fā)出請求偶房,下載圖片的路徑,把所有的圖...
    2dcc2b155e1e閱讀 243評論 0 0
  • 所謂瀑布流军浆,就是圖片分幾列有規(guī)律的排列棕洋,但是這里的排列是有要求的,普通的浮動布局會使圖片與圖片之間有很多的空隙乒融,這...
    小飛俠zzr閱讀 819評論 0 0
  • 1掰盘、懶加載 1.什么是懶加載? 懶加載也就是延遲加載赞季。當訪問一個頁面的時候愧捕,先把img元素或是其他元素的背景圖片路...
    xiaolizhenzhen閱讀 70,456評論 18 160
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情碟摆,實現(xiàn)同樣的效果;這時候需要使用工廠模式晃财。簡單...
    舟漁行舟閱讀 7,726評論 2 17