快速精通 JavaScript 的 “this”

閱讀時間約 4 分鐘
this 是 JavaScript 的一個關鍵字,也是讓新手困擾許久的主題,今天讓我們用更簡單、直接的方式來了解 this。
Photo made by me
JavaScript 在任何地方都可以存取到 this,與其他程式語言慣用的 this 有了差異,造成了 JavaScript 的 this 難懂的原因。

理解 this 之前先告訴自己:

  1. 範圍鍊會向外部環境搜尋變數(所在的物件內找到答案),一但 this 脫離了物件,可能會導致參照全域環境,在這種情況下 this 會有個預設值,嚴格模式下的 this 預設值是 undefined,非嚴格模式下的 this 預設值是全域物件。
  2. this 與函式宣告位置無關,關鍵在於函式被呼叫的方式。
  3. this 指的是函式執行時,這個作用範圍(scope)的所有者(owner),你可以用 call、apply 與 bind 改變 this 指向的對象,簡而言之,this 就是你 call 一個函數時,所傳入的第一個參數。
  4. ES6 的箭頭函數沒有自己的 this,所以在箭頭函數裡看到 this ,就當作是外面函數的 this 即可。

接下來讓我們來點練習

練習一:變數參照全域環境
func(p1, p2) // 等同於 func.call(undefined, p1, p2)
練習二:變數參照物件
obj.child.method(p1, p2) // 等同於 obj.child.method.call(obj.child, p1, p2)

有點概念了嗎?那麼請問以下傳回的值:

function func() {
  console.log(this);
}
func();
func( ) 等同於 func.call( ),嚴格模式下的 this 為 undefined,非嚴格模式下的 this 為 window 物件
var obj = {
    foo: function(){
      console.log(this);
  }
}
obj.foo()
obj.foo( ) 等同於 obj.foo.call(obj),this 為 obj
var obj = {
  foo: function(){
    console.log(this);
  }
}
var bar = obj.foo
obj.foo();
bar();
obj.foo( ) 等同於 obj.foo.call(obj),this 為 obj
bar( ) 等同於 bar.call( ),嚴格模式下的 this 為 undefined,非嚴格模式下的 this 為 window 物件
function fn() {
  console.log(this);
}
var arr = [fn, fn2]
arr[0]();
arr[0]( ) 等同於 arr.0.call(arr),this 為 arr
var getGender = function() {
  return this.gender;
}
var people1 = {
  gender: ‘female’,
  getGender: getGender
}
var people2 = {
  gender: ‘male’,
  getGender: getGender
}
console.log( people1.getGender() );
console.log( people2.getGender() );

console.log( people1.getGender( ) ) 等同於 people1.getGender().call(people1),this 為 female
console.log( people2.getGender( ) ) 等同於 people1.getGender().call(people2),this 為 male


感謝您的閱讀,我試著將生活與自己所學到的知識,以平易近人的方式傳達給正在努力進步的同好,甚至是領域之外卻有興趣的人。如果喜歡我的文章,歡迎贊助我,你的鼓勵也是我進步的動力。
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
37會員
31內容數
短篇奇幻作品將不定期更新。
留言0
查看全部
發表第一個留言支持創作者!
Ray C的沙龍 的其他內容
為了增進使用者體驗,前端愈來愈複雜,現在就讓我們一起搞懂技術名詞。
你可能已經看過 “ES6” 或 “JavaScript ES6” 一詞,並想知道它實際意味著什麼。別再想了,因為我們將深入研究 ES6 究竟是什麼,以及它與 JavaScript 的關係!
為了增進使用者體驗,前端愈來愈複雜,現在就讓我們一起搞懂技術名詞。
你可能已經看過 “ES6” 或 “JavaScript ES6” 一詞,並想知道它實際意味著什麼。別再想了,因為我們將深入研究 ES6 究竟是什麼,以及它與 JavaScript 的關係!
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
所屬產業? CrowdStrike 身處網路安全產業,為雲端資訊安全服務提供商。
Thumbnail
備課時想隨心所欲截圖及錄影? Windows10內建錄影功能學起來!
Thumbnail
所屬產業? Upstart 為軟體服務業,提供雲端貸款平台的服務。
Thumbnail
當你碰上申請台胞證急件時,知道該怎麼辦嗎?有時候突然被召喚去大陸,但手上也不確定有哪些資料是需要的,辦理台胞證又會等多久,今天就由簽證通,詳細的說明辦理台胞證的注意事項 ! 
Thumbnail
今天開始啃在中文資料使用 BERT 相關的一些資料,因為時間不太夠就先簡單的挑個小任務來玩:中文填字遊戲
Thumbnail
【作者推薦本文原因】 大家都知道做PPT簡報時,保持簡單、扼要是最重要的關鍵,但背景全部留白又顯得太過無趣、沒有突出的感覺,這個時候,找PPT模板也是一種必須具備的技能!作者整理了6個PPT模板網站,幾乎你之前所看過的PPT模板都可以在這裡找到,趕快把這些網站存到我的最愛,你的高質量PPT簡報,絕對
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
所屬產業? CrowdStrike 身處網路安全產業,為雲端資訊安全服務提供商。
Thumbnail
備課時想隨心所欲截圖及錄影? Windows10內建錄影功能學起來!
Thumbnail
所屬產業? Upstart 為軟體服務業,提供雲端貸款平台的服務。
Thumbnail
當你碰上申請台胞證急件時,知道該怎麼辦嗎?有時候突然被召喚去大陸,但手上也不確定有哪些資料是需要的,辦理台胞證又會等多久,今天就由簽證通,詳細的說明辦理台胞證的注意事項 ! 
Thumbnail
今天開始啃在中文資料使用 BERT 相關的一些資料,因為時間不太夠就先簡單的挑個小任務來玩:中文填字遊戲
Thumbnail
【作者推薦本文原因】 大家都知道做PPT簡報時,保持簡單、扼要是最重要的關鍵,但背景全部留白又顯得太過無趣、沒有突出的感覺,這個時候,找PPT模板也是一種必須具備的技能!作者整理了6個PPT模板網站,幾乎你之前所看過的PPT模板都可以在這裡找到,趕快把這些網站存到我的最愛,你的高質量PPT簡報,絕對