JavaScript中this使用

JS中this指向

this在全局作用于下指向window

函數(shù)中使用的this指向:

  • 函數(shù)在調(diào)用時未状,JavaScript會默認給this綁定一個值;
  • this的綁定和定義的位置(編寫的位置)沒有關系蜕径;
  • this的綁定和調(diào)用方式以及調(diào)用的位置有關系两踏;
  • this是在運行時被綁定的;

this綁定方式

  • 默認綁定兜喻;
  • 隱式綁定梦染;
  • 顯式綁定;
  • new綁定

默認綁定

獨立函數(shù)調(diào)用時

獨立的函數(shù)調(diào)用我們可以理解成函數(shù)沒有被綁定到某個對象上進行調(diào)用虹统;

function foo() {
  console.log(this)
}
foo() // wwindow

隱式綁定

通過某個對象進行調(diào)用的弓坞,會綁定該對象

隱式綁定有一個前提條件:

  • 必須在調(diào)用的對象內(nèi)部有一個對函數(shù)的引用(比如一個屬性);
  • 如果沒有這樣的引用车荔,在進行調(diào)用時渡冻,會報找不到該函數(shù)的錯誤;
  • 正是通過這個引用忧便,間接的將this綁定到了這個對象上族吻;
var obj = {
  name: "why",
  foo: foo
}

obj.foo() // obj對象

顯式綁定

使用call和apply調(diào)用函數(shù)。

call和apply區(qū)別:第一個參數(shù)是相同的珠增,后面的參數(shù)超歌,apply為數(shù)組,call為參數(shù)列表蒂教;

這兩個函數(shù)的第一個參數(shù)都要求是一個對象巍举。在調(diào)用這個函數(shù)時,會將this綁定到這個傳入的對象上凝垛。

function sum(num1, num2, num3) {
  console.log(num1 + num2 + num3, this)
}

sum.call("call", 20, 30, 40)
sum.apply("apply", [20, 30, 40])

bind顯式綁定懊悯,可以將一個函數(shù)總是顯式地綁定到一個對象上

function foo() {
  console.log(this)
}
// 默認綁定和顯示綁定bind沖突: 優(yōu)先級(顯示綁定)
var newFoo = foo.bind("aaa")
newFoo()

new綁定

JavaScript中的函數(shù)可以當做一個類的構造函數(shù)來使用蜓谋,也就是使用new關鍵字。

使用new關鍵字來調(diào)用函數(shù)是炭分,會執(zhí)行如下的操作:

  1. 創(chuàng)建一個全新的對象桃焕;
  2. 這個新對象會被執(zhí)行prototype連接;
  3. 這個新對象會綁定到函數(shù)調(diào)用的this上(this的綁定在這個步驟完成)捧毛;
  4. 如果函數(shù)沒有返回其他對象观堂,表達式會返回這個新對象;
function Person(name, age) {
  this.name = name
  this.age = age
}

var p1 = new Person("why", 18)
console.log(p1.name, p1.age)

綁定規(guī)則優(yōu)先級

  1. 默認規(guī)則的優(yōu)先級最低
  2. 顯示綁定優(yōu)先級高于隱式綁定
  3. new綁定優(yōu)先級高于隱式綁定
  4. new綁定優(yōu)先級高于bind
    1. new綁定可以和bind一起使用呀忧,new綁定優(yōu)先級更高
  5. new綁定和call师痕、apply是不允許同時使用的,所以不存在誰的優(yōu)先級更高

其他綁定

內(nèi)置函數(shù)的綁定

setTimeout(function() {
  console.log(this) // window
}, 2000)
const boxDiv = document.querySelector('.box')
boxDiv.onclick = function() {
  console.log(this) // box
}
boxDiv.addEventListener('click', function() {
  console.log(this) // box
})
var names = ["abc", "cba", "nba"]
names.forEach(function(item) {
  console.log(this) // abcd
}, "abcd")

忽略顯示綁定

在顯示綁定中荐虐,我們傳入一個null或者undefined七兜,那么這個顯示綁定會被忽略,使用默認規(guī)則

function foo() {
  console.log(this)
}
// apply/call/bind: 當傳入null/undefined時, 自動將this綁定成全局對象
foo.apply(null)
foo.apply(undefined)

間接函數(shù)引用

賦值(obj2.foo = obj1.foo)的結果是foo函數(shù)福扬;

foo函數(shù)被直接調(diào)用腕铸,那么是默認綁定;

var obj1 = {
  name: "obj1",
  foo: function() {
    console.log(this)
  }
}
var obj2 = {
  name: "obj2"
};
obj2.bar = obj1.foo
obj2.bar() // obj2
(obj2.bar = obj1.foo)() // window

ES6箭頭函數(shù)this

箭頭函數(shù)并不綁定this對象铛碑,那么this引用就會從上層作用于中找到對應的this

var obj = {
  data: [],
  getData: function() {
    setTimeout(() => {
      var result = ["abc", "cba", "nba"]
      this.data = result
    }, 2000);
  }
}
obj.getData()
const boxDiv = document.querySelector('.box')
boxDiv.onclick = function() {
  console.log(obj.data) // ["abc", "cba", "nba"]
}

如果getData也是一個箭頭函數(shù)狠裹, 則不會賦值到data

var obj = {
  data: [],
  getData: function() {
    setTimeout(() => {
      var result = ["abc", "cba", "nba"]
      this.data = result
    }, 2000);
  }
}
obj.getData()
const boxDiv = document.querySelector('.box')
boxDiv.onclick = function() {
  console.log(obj.data) // []
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汽烦,隨后出現(xiàn)的幾起案子涛菠,更是在濱河造成了極大的恐慌,老刑警劉巖撇吞,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俗冻,死亡現(xiàn)場離奇詭異,居然都是意外死亡牍颈,警方通過查閱死者的電腦和手機迄薄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煮岁,“玉大人讥蔽,你說我怎么就攤上這事』” “怎么了冶伞?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長步氏。 經(jīng)常有香客問我响禽,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任金抡,我火速辦了婚禮瀑焦,結果婚禮上腌且,老公的妹妹穿的比我還像新娘梗肝。我一直安慰自己,他們只是感情好铺董,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布巫击。 她就那樣靜靜地躺著,像睡著了一般精续。 火紅的嫁衣襯著肌膚如雪坝锰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天重付,我揣著相機與錄音顷级,去河邊找鬼。 笑死确垫,一個胖子當著我的面吹牛弓颈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播删掀,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼翔冀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了披泪?” 一聲冷哼從身側(cè)響起纤子,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎款票,沒想到半個月后控硼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡艾少,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年卡乾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姆钉。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡说订,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出潮瓶,到底是詐尸還是另有隱情陶冷,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布毯辅,位于F島的核電站埂伦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏思恐。R本人自食惡果不足惜沾谜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一膊毁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧基跑,春花似錦婚温、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至篱竭,卻和暖如春力图,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掺逼。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工吃媒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吕喘。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓赘那,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兽泄。 傳聞我的和親對象是個殘疾皇子漓概,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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