亚洲 国产精品 日韩-亚洲 激情-亚洲 欧美 91-亚洲 欧美 成人日韩-青青青草视频在线观看-青青青草影院

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > JavaScript內的this指向

JavaScript內的this指向

來源:千鋒教育
發布人:qyf
時間: 2023-02-23 17:16:00 1677143760

JavaScript內的this指向

  ● 在 javascript 語言中, 有一個奇奇怪怪的 "關鍵字" 叫做 this

  ● 為什么說它是 奇奇怪怪 呢, 是因為你寫出 100 個 this, 可能有 100 個解釋, 完全不挨邊

  ● 但是, 在你的學習過程中, 搞清楚了 this 這個玩意, 那么會對你的開發生涯有很大幫助的

  ● 接下來咱們就開始一點一點的認識一下 this

  this 初認識

  ● 看到 this, 先給他翻譯過來 "這個"

  ● 到底啥意思呢 ?

  ○ 飯桌上, 你媽和你說, 你多吃點的這個

  ○ 商店里, 你媳婦和你說, 這個包 這個包 這個包 我都要

  ○ 宴會上, 你爸和人介紹說, 這個傻小子是我兒子

  ● 你看, 每一句話上都有 "這個", 但是每個 "這個" 都是一個意思嗎 ? 并不

  ● 就像我們 js 內的 this 一樣, 每一個 this 的意思都不一樣

  ● 但是我們會發現

  ○ 在說話的過程中, "這個" 是和我們說話的手勢有關系

  ● 在 js 內一個道理

  ○ this 的意思是和代碼的 "手勢" 有關系

  ● 例子 :

  ○ 當你媳婦手指著一個 LV 包的時候, 說的 "這個" 指代的就是 LV包`

  ○ 當你媽指著魚香肉絲的時候說 "這個" 指代的就是 魚香肉絲

  ○ 所以在 javascript 內的 this 是要看 "說這句話的代碼手指向哪里了"

  ● 看看下面一段代碼

  var box = document.querySelector('#box')

  box.onclick = function () {

  console.log(this)

  }

  ○ 當你點擊 box 這個元素的時候, 會觸發后面的函數

  ○ 然后函數一執行, 就會在控制臺打印一下 this

  ○ 這里的 this 就是 box 這個元素

  ● 這就是一個非常簡單的 this 指向的例子了

  ● 接下來我們就開始詳細學習一下 this

  給你個概念

  ● this , 是一個指針形變量, 它動態的指向當前函數的運行環境

  ● "什么鬼東西, 我聽不懂啊"

  ● 給一個私人的解釋 : "根據 this 所在的函數是如何被調用的來決定 this 是什么"

  ● 舉個栗子來看一下

  function fn() {

  console.log(this)

  }

  fn()

  // this 就是 window

  ● 因為 this 是在 fn 函數內, 所以 fn 函數的調用方式就決定了這個 this 是什么

  function a() {

  function b() {

  console.log(this)

  }

  b()

  }

  a()

  // this 就是 window

  ○ 因為 this 是在 b 函數內, 所以 b 函數的調用方式決定了 this 是什么, 和 a 函數沒關系

  ● 就是這個意思

  ● 最后, 根據這些年的經驗總結給出一個私人的概念, 要牢記

  ○ 函數的 this

  ○ 和函數定義在哪沒關系

  ○ 和函數怎么定義沒關系

  ○ 只看這個函數的調用方式

  ○ 箭頭函數除外

  對象調用

  ● 對象調用, 就是利用一個對象作為宿主來調用函數

  ● 最簡單的方式就是把函數寫在一個對象內, 利用對象來調用

  // 對象內寫一個函數

  const obj = {

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

  }

  // 調用這個函數

  obj.fn()

  ○ 這時候, 我們調用了和這個對象內的 fn 函數

  ○ 調用方式就是利用對象調用的函數, 所以在這個函數內的 this 就是 obj 這個對象

  ○ 換句話說, 只要在這個函數內, 只要出現 this 就是這個對象

  全局調用

  ● 顧名思義, 全局調用就是直接調用一個全局函數

  function fn() {

  console.log(this)

  }

  fn()

  ○ 此時這個函數內的 this 就是 window

  ○ 可能有的小伙伴覺得瘋了

  ○ 但是我們仔細思考一下, 你會發現

  ○ 其實 fn 因為是在全局上的, 那么其實調用的完整寫法可以寫成 window.fn()

  ○ 此時就回到了之前對象調用那條路上, 這樣就通順了

  奇怪的調用

  ● 這個時候, 有的小伙伴可能會想到一個問題, 如果這個函數不放在全局呢 ?

  const obj = {

  fn: function () {

  function fun() {

  console.log(this)

  }

  fun()

  }

  }

  obj.fn()

  ● 此時的 this 應該是什么呢 ?

  ● 按照之前的思路思考

  ○ obj.fn() 確實調用了函數, 但是 this 不是在 obj.fn 函數內, 是在 fun 函數內

  ○ fun() 確實也調用了函數, 但是我沒有辦法寫成 window.fun()

  ○ 那么 this 到底是不是 window 呢, 還是應該是 obj 內

  ● 答案確實是 window, 這又是為什么呢 ?

  捋一下思路

  ● 說道這里, 我們會發現

  ● this 真的是好奇怪哦 o(* ̄︶ ̄*)o 搞不定了

  ● 要是按照這個方式, 我來回來去的得記多少種, 誰會記得下來呢

  ● 接下來(劃重點)

  我用我代碼三十年的經驗給你總結出來了一些內容, 希望你能牢記

  this 的個人經驗

  ● 首先, this 在各種不同的情況下會不一樣

  ● 那么從現在開始我把我總結的內容毫無保留的傳授給你

  經驗一 :

  ● 在 js 的非嚴格模式下適用

  ● 在非箭頭函數中適用

  ● 不管函數定義在哪, 不管函數怎么定義, 只看函數的調用方式

  ○ 只要我想知道 this 是誰

  ○ 就看這個 this 是寫在哪個函數里面

  ○ 這個函數是怎么被調用的

  觀察 this 在哪個函數內

  function fn() {

  console.log(this)

  }

  // this 在函數 fn 內, 就看 fn 函數是怎么被調用的就能知道 this 是誰

  const obj = {

  fn: function () {

  console.log(this)

  }

  }

  // this 在 obj.fn 函數內, 就看這個函數怎么被調用的就能知道 this 是誰

  const obj = {

  fn: function () {

  function fun() {

  console.log(this)

  }

  }

  }

  // 這個 this 是在 fun 函數內

  // 如果你想知道這個 this 是誰

  // 和 obj.fn 函數沒有關系, 只要知道 fun 函數是怎么被調用的就可以了

  ● 一定要注意 : 你想知道的 this 在哪個函數內, 就去觀察哪個函數的調用方式就好了

  一些常見的函數調用方式

  1. 普通調用

  ● 調用方式 : 函數名()

  ● this 是 window

  ● 只要你書寫 "函數名()" 調用了一個函數, 那么這個函數內的 this 就是 window

  function fn() {

  console.log(this)

  }

  fn()

  // 這里就是 fn() 調用了一個函數, 那么 fn 內的 this 就是 window

  const obj = {

  fn: function () {

  function fun() {

  console.log(this)

  }

  fun()

  }

  }

  obj.fn()

  // 這里的 this 因為是在 fun 函數內

  // fun() 就調用了這個 fun 函數

  // 所以不用管 fun 函數寫在了哪里

  // 這個 fun 函數內的 this 就是 window

  2. 對象調用

  ● 調用方式:

  ○ 對象.函數名()

  ○ 對象['函數名']()

  ● this 就是這個對象, 對象叫啥, 函數內的 this 就叫啥

  const obj = {

  fn: function () {

  console.log(this)

  }

  }

  obj.fn()

  // 因為 obj.fn() 調用了這個函數, 所以 obj.fn 函數內的 this 就是 obj

  const xhl = {

  fn: function () {

  console.log(this)

  }

  }

  xhl.fn()

  // 因為 obj.fn() 調用了這個函數, 所以 xhl.fn 函數內的 this 就是 xhl

  function fn() {

  const xhl = {

  fn: function () {

  console.log(this)

  }

  }

  xhl.fn()

  }

  fn()

  // 因為我們要觀察的 this 是在 xhl.fn 這個函數內

  // 所以只需要關注這個函數是如何被調用的即可

  // 因為是 xhl.fn 調用了和這個函數, 所以函數內的 this 就是 xhl

  3. 定時器調用

  ● 調用方式

  ○ setTimeout(function () {}, 1000)

  ○ setInterval(function () {}, 1000)

  ● this 就是 window

  ● 一個函數不管是怎么定義的, 只要被當做定時器處理函數使用, this 就是 widnow

  setTimeout(function () {

  console.log(this)

  }, 1000)

  // 這里的 this 就是 window

  setInterval(function () {

  console.log(this)

  }, 1000)

  // 這里的 this 就是 window

  const xhl = {

  fn: function () {

  console.log(this)

  }

  }

  setTimeout(xhl.fn, 1000)

  // 這里的 xhl.fn 函數不是直接書寫 xhl.fn() 調用的

  // 而是給到了 setTimeout 定時器處理函數

  // 所以這里的 this 就是 window

  4. 事件處理函數

  ● 調用方式

  ○ 事件源.on事件類型 = 事件處理函數

  ○ 事件源.addEventListener(事件類型, 事件處理函數)

  ● this 就是 事件源

  ● 只要是作為事件處理函數使用, 那么該函數內的 this 就是 事件源

  奧,對了,事件就是:在事件中,當前操作的那個元素就是事件源

  box.onclick = function () {

  console.log(this)

  }

  // 這里的 this 就是 box

  box.addEventListener('click', function () {

  console.log(this)

  })

  // 這里的 this 就是 box

  const xhl = {

  fn: function () {

  console.log(this)

  }

  }

  box.addEventListener('click', xhl.fn)

  // 這里的 xhl.fn 函數不是直接書寫 xhl.fn() 調用的

  // 而是給到了 事件, 被當做了事件處理函數使用

  // 所以這里的 this 就是 事件源box

  const xhl = {

  fn: function () {

  console.log(this)

  }

  }

  box.onclick = xhl.fn

  // 這里的 xhl.fn 函數不是直接書寫 xhl.fn() 調用的

  // 而是給到了 事件, 被當做了事件處理函數使用

  // 所以這里的 this 就是 事件源box

  5. 構造函數調用

  ● 調用方式

  ○ new 函數名()

  ● this 就是該構造函數的當前實例

  ● 只要和 new 關鍵字調用了, this 就是實例對象

  function fn() {

  console.log(this)

  }

  const f = new fn()

  // 這里的因為 fn 函數和 new 關鍵字在一起了

  // 所以這里的 this 就是 fn 函數的實例對象

  // 也就是 f

  const xhl = {

  fn: function () {

  console.log(this)

  }

  }

  const x = new xhl.fn()

  // 這里的 xhl.fn 也是因為和 new 關鍵字在一起了

  // 所以這里的 this 就是 xhl.fn 函數的實例對象

  // 也就是 x

  記清楚原則 :

  不管函數在哪定義

  不管函數怎么定義

  只看函數的調用方式

  經驗二 :

  ● 在嚴格模式下適用

  ● 其實只有一個

  ○ 全局函數沒有 this, 是 undefined

  ○ 其他的照搬經驗一就可以了

  1. 非嚴格模式

  // 非嚴格模式

  function fn() {

  console.log(this)

  }

  fn()

  // 因為是在非嚴格模式下, 這里的 this 就是 window

  2. 嚴格模式

  // 嚴格模式

  'use strict'

  function fn() {

  console.log(this)

  }

  fn()

  // 因為是在嚴格模式下, 這里的 this 就是 undefined

  記清楚原則 :

  嚴格模式下

  全局函數沒有 this

  是個 undefiend

  經驗三 :

  ● 專門來說一下箭頭函數

  ● 其實也只有一條

  ○ 推翻之前的所有內容

  ○ 箭頭函數內沒有自己的 this

  ○ 箭頭函數內的 this 就是外部作用域的 this

  ● 換句話說, 當你需要判斷箭頭函數內的 this 的時候

  ○ 和函數怎么調用沒有關系了

  ○ 要看函數定義在什么位置

  // 非箭頭函數

  const xhl = {

  fn: function () {

  console.log(this)

  }

  }

  xhl.fn()

  // 因為是 非箭頭函數, 所以這里的 this 就是 xhl

  // ==========================================================

  // 箭頭函數

  const xhl = {

  fn: () => {

  console.log(this)

  }

  }

  xhl.fn()

  // 因為是 箭頭函數, 之前的經驗不適用了

  // 這個函數外部其實就是全局了, 所以這里的 this 就是 window

  // 非箭頭函數

  box.onclick = function () {

  console.log(this)

  }

  // 因為是 非箭頭函數, 這里的 this 就是 box

  // ==========================================================

  // 箭頭函數

  box.onclick = () => {

  console.log(this)

  }

  // 因為是 箭頭函數

  // 這個函數外部就是全局了, 所以這里的 this 就是 window

  // 非箭頭函數

  const obj = {

  fn: function () {

  function fun() {

  console.log(this)

  }

  fun()

  }

  }

  obj.fn()

  // 因為是 非箭頭函數, 所以 fun 函數內的 this 就是 window

  // ==========================================================

  // 箭頭函數

  const obj = {

  fn: function () {

  const fun = () => {

  console.log(this)

  }

  fun()

  }

  }

  obj.fn()

  // 因為是 箭頭函數

  // 那么這個 fun 外面其實就是 obj.fn 函數

  // 所以只要知道了 obj.fn 函數內的 this 是誰, 那么 fun 函數內的 this 就出來了

  // 又因為 obj.fn 函數內的 this 是 obj

  // 所以 fun 函數內的 this 就是 obj

  記清楚原則 :

  只要是箭頭函數

  不管函數怎么調用

  就看這個函數定義在了哪里

  最后

  ● 好了

  ● 按照以上三個經驗, 記清楚原則

  ● 那么在看到 this 就不慌了

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
成·人免费午夜无码视频| 在线观看国产精选免费| 亚洲最大的熟女水蜜桃AV网站| 在糖心VLOG唐伯虎女主角是谁| HD2LINODE日本成熟IP| 国产AV永久无码精品网站| 护士奶头又白又大又好摸| 嫩草国产福利视频一区二区| 色五月丁香六月欧美综合| 亚洲AV永久无码成人私密按摩| 18禁无码无遮挡H动漫免费看| 大肉大捧一进一出的视频| 国自产精品手机在线观看视频| 麻豆XXXXXX在线观看| 色嗨嗨AV一区二区三区| 亚洲码与欧洲码一二三四区别| FREE嫩白18SEⅩ性HD处| 国产手机在线国内精品| 免费人妻AV无码专区| 天堂国品一二三产品区别大吗| 亚洲色欲久久久久综合网| 班长哭了能不能再抠游戏里面的钱 | 野花电影3在线观看免费| 爆乳大森しずか无码| 黑森林精选AV导航| 欧洲VODAFONEWIFI喷| 亚洲AV无码不卡| 99国产精品无码专区| 国产乱码一卡二卡3卡4卡网站| 乱人伦XXXX国语对白| 偷国产乱人伦偷精品视频 | 久久久久精品国产99久久综合| 人人人人人人一摸| 亚洲日韩乱码1区二区| 成熟交BGMBGMBGM中国| 久久99久久99精品免观看吃奶 | 麻花传媒68XXX在线观看| 糖心短视频VLOG柚子猫| 中文字幕AV无码专区第一页| 国产精品美女久久久浪潮AV| 农村妇女野外交性高清片| 亚洲A∨精品无码一区二区| WWW久久只有这里有精品| 精品国产一区二区三区久久久狼| 人体欣赏SHOWYBEAUTY| 亚洲色大18成人网站WWW| 国产AV熟女一区二区三区| 麻豆XXXXXX在线观看| 性猛交富婆Ⅹ×××乱大交| 把老师摁在黑板上做了一节课作文| 娇妻在厨房被朋友玩得呻吟| 搡搡BB搡搡搡搡BBB| 中文在线っと好きだっ最新版 | 亚洲色18禁成人网站WWW| 公么的大龟征服了我BD| 男女作爱全部免费观爱| 亚洲成亚洲乱码一二三四区软件| 成人性生交大片免费看| 蜜臀AV在线无码国产| 亚洲VA久久久噜噜噜久久天堂| 成人免费一区二区三区视频| 裸身美女无遮挡永久免费视频 | 无码一区二区av| 被黑人捅入子宫射精小说| 老师在办公室被躁在线观看| 亚洲AV无码成人精品网站| 粉嫩被黑人两根粗大猛烈进出视频 | BT天堂А√天堂资源地址| 精品无码久久久久国产动漫3D| 天堂√最新版中文在线| YSL蜜桃色成人| 美美哒中文日本免费6| 亚洲精品国产美女久久久99 | 无翼乌全彩工口里番库| 成人无码区免费AⅤ片在线观看 | 午夜影视啪啪体验区入口| 大J8黑人BBW巨大怪物| 欧美黑人猛XXxXX内射| 一本一道人人妻人人妻ΑV| 狠狠色丁香九九婷婷综合| 无码国产精品一区二区高潮| 成人无码A区在线观看视频| 欧美成本人网站免费观看| 伊人天天久大香线蕉AV色| 娇小的学生BBW18| 亚欧乱色国产精品免费九库| 国产GaySeXChina男同| 人人妻人人澡人人爽人人蜜臀| 19岁MACBOOKPRO高清| 老头猛的挺进她莹莹的体导演是谁| 亚洲精品国产精品乱码不卡√| 国产一区二区三精品久久久无广告| 熟女精品视频一区二区三区| 成·人免费午夜无码视频| 强被迫伦姧在线观看无码| 91久久精品www人人做人人爽| 两根大肉大捧一进一出好爽视频 | 性爱xxxx在线xxxx欧美| 国产精品久久国产精麻豆99网站| 色悠久久久久综合欧美99| 粗大挺进朋友未婚妻| 日本三级吃奶头添泬| 被教官按在寝室狂到腿软视频| 欧美无人区码卡二三卡四卡| 在线精品一区二区三区| 久久人人爽人人爽人人AV| 亚洲中文字幕无码久久2020| 精品人妻AV区乱码| 亚洲日韩一区二区一无码| 久久99精品久久久久久9| 亚洲精品无码少妇30P| 精品久久久无码中文字幕天天| 亚洲国产精品热久久| 精品深夜AV无码一区二区| 亚洲另类无码专区偷拍| 久久 国产 尿 小便 嘘嘘| 亚洲欭美日韩颜射在线| 久久久水蜜桃国产成人网站| 一二三四在线看日本高清| 巨爆乳无码视频在线观看| 中国老太卖婬HD播放| 女人18片毛片免费| JAPANESE娇小侵犯| 人与性动交AAAABBBB| 粗大猛烈进出高潮视频免费看| 熟女一区二区三区| 国产精品原创巨作AV女教师| 西西4444WWW大胆无码| 好男人影视在线观看下载| 亚洲精品卡2卡三卡4卡2卡乱码| 久久WWW成人_看片| 中国老熟妇自拍HD发布| 免费高清A级毛片在线播放| 99久久人妻无码中文字幕系列 | 二三四五六七无产乱码| 天天综合天天爱天天做| 国产亚AV手机在线观看| 亚洲欧美中文日韩V在线观看 | 中文字幕色偷偷人妻久久| 欧美日韩国产精品自在自线| 成人AV无码一区二区三区| 挺进大幂幂的滋润花苞御女天下| 国产午夜鲁丝片AV无码| 亚洲色偷偷综合亚洲AV色欲| 美女与野兽在线观看| 扒开两腿中间缝流白浆在线看| 熟妇高潮一区二区精品| 国产在线无码精品电影网 | 久久婷婷国产综合精品| 99精品久久久久精品双飞| 日韩视频一二三区2021| 国产无人区卡一卡二卡乱码| 亚洲一区二区三区乱码AⅤ蜜桃| 奶头被民工们吸得又红又肿怎么办 | 国产成人夜色高潮福利影视| 亚洲成熟丰满熟妇高潮XXXXX| 久久婷婷国产综合精品| ZOOM与牛性胶ZOOM| 无码人妻精品一区二区三区下载| 精品国精品无码自拍自在线| 自拍偷自拍亚洲精品被多人伦好爽| 欧洲美熟女乱又伦AV| 国产精品99无码一区二区| 亚洲免费福利视频| 欧美精品一区二区精品久久| 国产成人精品一区二区秒拍| 亚洲欧美成人精品香蕉网| 欧美精品一区二区三区在线| 国产成人愉拍免费视频| 亚洲一本大道无码AV天堂| 欧洲最猛黑人XXXⅩ猛男欧| 国产精品看高国产精品不卡| 野花香HD免费高清版6高清版| 去部队探亲晚上叫太大声| 国产毛片一二区三区四区 | 亚洲丰满性熟妇ⅩXXOOO太阳| 免费男同GAY片AV网站| 国产AV无码专区影视| 亚洲熟妇色XXXXX欧美老妇| 人妻无码第一区二区三区 | 亚洲日本中文字幕乱码在线| 琴乳液狂飙却被空吸入口中| 国产互换人妻好紧HD无码| 一本久道久久综合狠狠躁AV| 日韩精品一区二区三区在线观看| 黑人与日本XXXXXTV| FREE性玩弄少妇HD性老妇| 亚拍精品一区二区三区探花| 男女无遮挡XX00动态图1| 国产精品高潮露脸在线观看| 与狐妖的同居生活| 天天躁夜夜躁狠狠是什么心态| 久久婷婷五月综合色国产香蕉| 嗯啊开小嫩苞好深啊H视频| 亚洲综合无码一区二区三区不卡| 日韩精品一区二区亚洲AV观看| 久久精品国产69国产精品亚洲| 岛国无码AV不卡一区二区| 一面亲上边一面膜下边的免费| 天堂AV无码AV在线A√|