<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【面試題】1369- 什么時(shí)候不能使用箭頭函數(shù)?

          共 4844字,需瀏覽 10分鐘

           ·

          2022-07-05 09:05

          箭頭函數(shù)

          箭頭函數(shù)是和我們工作密切相關(guān)的東西;可以說(shuō)箭頭函數(shù)的誕生,給我們的工作帶來(lái)了極大的便利。但是箭頭函數(shù)有什么缺點(diǎn)?什么時(shí)候不能使用箭頭函數(shù)? 這你了解嗎?
          我們覺(jué)得箭頭函數(shù)很高級(jí),可以規(guī)避 this 的問(wèn)題,所有的場(chǎng)景下都是用箭頭函數(shù)。在不能使用的場(chǎng)景下使用了,出現(xiàn)了問(wèn)題,你還不知道是什么問(wèn)題,那這不是瞎添亂嗎!是不是!

          這里給大家先提出一個(gè)問(wèn)題:

          const obj = {
              name'張三',
              getName() {
                  return this.name
              },
              getName1() => {
                  return this.name
              }
          }
          obj.__proto__.getName2 = function({
              return this.name
          }
          obj.__proto__.getName3 = () => {
              return this.name
          }
          console.log('普通函數(shù)',obj.getName())
          console.log('普通函數(shù)',obj.getName2())
          console.log('箭頭函數(shù)',obj.getName1())
          console.log('箭頭函數(shù)',obj.getName3())
          復(fù)制代碼

          大家覺(jué)得會(huì)輸出什么呢?

          先悄悄思考一下!

          3,2,1 公布答案!



          image.png

          如果答錯(cuò)了,也別灰心,畢竟網(wǎng)絡(luò)有著35的延遲,影響著你的操作和思考,看完這篇文章,保證你就不會(huì)答錯(cuò)了!

          箭頭函數(shù)有什么缺點(diǎn)?

          1. 沒(méi)有 arguments,如果要用,可以用 rest 參數(shù)代替。這里我們定義一個(gè)箭頭函數(shù)和一個(gè)普通函數(shù)還有一個(gè)使用 rest 參數(shù)的箭頭函數(shù):

            const fn1 = () => {
            console.log('arguments'arguments)
            }
            fn1(100200)

            function fn2(){
            console.log('arguments'arguments)
            }
            fn2(100200)

            const fn3 = (...values) => {
            console.log('values', values)
            }
            fn3(100200)
            復(fù)制代碼
            image.png
          2. 無(wú)法通過(guò) apply、call、bind 改變this指向 這里我們?cè)诙x一個(gè)箭頭函數(shù)和一個(gè)普通函數(shù)

            const fn3 = () => {
            console.log('this'this)
            }
            fn3()

            function fn4(){
            console.log('this'this)
            }
            fn4()
            復(fù)制代碼

            箭頭函數(shù)的this就是他父容器的this,不是在執(zhí)行的時(shí)候確定的,而是在定義的時(shí)候確定的。

            如上圖,我們可以發(fā)現(xiàn),箭頭函數(shù)的兩次執(zhí)行的 this 都是指向了 Windows使用call并沒(méi)有發(fā)生改變,而普通函數(shù)第一次是指向了Windows第二次則是變成了我們傳入的

          什么時(shí)候不能使用箭頭函數(shù)?

          1. 對(duì)象方法中,不適用箭頭函數(shù)

          const obj = {
              name'張三',
              getName() {
                  return this.name
              },
              getName1() => {
                  return this.name
              }
          }
          復(fù)制代碼

          我們?cè)趯?duì)象中定義了普通函數(shù):getName箭頭函數(shù) getName1,接下來(lái)我們來(lái)調(diào)用一下:

          console.log('普通函數(shù)',obj.getName())
          console.log('箭頭函數(shù)',obj.getName1())
          復(fù)制代碼

          這里給大家默想3s輸出什么?

          公布答案:我們發(fā)現(xiàn)箭頭函數(shù)好像并沒(méi)有獲取到值誒!

          為什么對(duì)象方法中,箭頭函數(shù)的this指向不是這個(gè)對(duì)象?

          1. this 永遠(yuǎn)指向函數(shù)的調(diào)用者
          2. 在箭頭函數(shù)中,this 指向的是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象。換句話說(shuō),箭頭函數(shù)沒(méi)有自己的 this,而是繼承父作用域中的 this。

          obj.getName()this指向函數(shù)的調(diào)用者,也就是obj實(shí)例,因此this.name = "張三"

          getName1()通過(guò)箭頭函數(shù)定義,而箭頭函數(shù)是沒(méi)有自己的this,會(huì)繼承父作用域的this

          因此obj.getName1()執(zhí)行時(shí),此時(shí)的作用域指向window,而window沒(méi)有定義age屬性,所有報(bào)空。

          從例子可以得出:對(duì)象中定義的函數(shù)使用箭頭函數(shù)是不合適的

          2. 原型方法中,不適用箭頭函數(shù)

          const obj = {
              name'張三',
          }
          obj.__proto__.getName = function({
              return this.name
          }
          obj.__proto__.getName1 = () => {
              return this.name
          }
          復(fù)制代碼

          我們又又又在對(duì)象中定義了普通函數(shù):getName箭頭函數(shù) getName1,接下來(lái)我們來(lái)調(diào)用一下:

          console.log(obj.getName())
          console.log(obj.getName1())
          復(fù)制代碼

          這里再再再給大家默想3s輸出什么?

          bang bang bang 公布答案:

          為什么?

          出現(xiàn)問(wèn)題的原因是this指向window對(duì)象,這和使用箭頭函數(shù)在對(duì)象中定義方法十分類似。

          3. 構(gòu)造函數(shù)也不行!

          我們又又又定義了普通的構(gòu)造函數(shù):Foo箭頭函數(shù) Foo1,接下來(lái)我們來(lái)調(diào)用一下:

          function Foo (name, sex{
              this.name = name
              this.sex = sex
          }
          const Foo1 = (name, sex) => {
              this.name = name
              this.sex = sex
          }
          console.log('普通的構(gòu)造函數(shù):'new Foo('張三''男'))
          console.log('箭頭函數(shù):'new Foo1('張三''男'))
          復(fù)制代碼

          不僅不行,還報(bào)錯(cuò)了呢!

          為什么?

          構(gòu)造函數(shù)是通過(guò) new 關(guān)鍵字來(lái)生成對(duì)象實(shí)例,生成對(duì)象實(shí)例的過(guò)程也是通過(guò)構(gòu)造函數(shù)給實(shí)例綁定 this 的過(guò)程,而箭頭函數(shù)沒(méi)有自己的 this。因此不能使用箭頭作為構(gòu)造函數(shù),也就不能通過(guò) new 操作符來(lái)調(diào)用箭頭函數(shù)。

          4. 動(dòng)態(tài)上下文中的回調(diào)函數(shù)

          比如,我們需要給一個(gè)按鈕添加點(diǎn)擊事件:

          const btn1 = document.getElementById('btn1')
          btn1.addEventListener('click', () => {
              this.innerHTML = 'clicked'
          })
          復(fù)制代碼

          如果我們?cè)诨卣{(diào)中不需要使用到 this,那就啥問(wèn)題也沒(méi)有,但是!使用到了 this,那么問(wèn)題就大大的了!

          為什么呢?

          箭頭函數(shù)的 this 指向的是他的父作用域(這里就指向了 window),而不是指向這個(gè)button。這時(shí)候我們需要使用普通函數(shù)才可以。

          5. Vue 生命周期和 method 中也不能使用箭頭函數(shù)

          image.png

          為什么不行呢?

          Vue 本質(zhì)上是一個(gè)對(duì)象,我們說(shuō)過(guò)對(duì)象方法中,不適用箭頭函數(shù)。他的本質(zhì)上的和對(duì)象方法中,不適用箭頭函數(shù)是一樣的。

          那么我有一個(gè)問(wèn)題:Vue不行,作為大熱框架之一的 react 行嗎?

          回答是:react 行

          因?yàn)?Vue組件本質(zhì)上是一個(gè) JS 對(duì)象;React 組件(非Hooks)他本質(zhì)上是一個(gè) ES6 的 class

          不信的話我們測(cè)試一下就知道了

          class Man {
              constructor(name, city) {
                  this.name = name
                  this.city = city
              }
              getName = () => {
                  return this.name
              }
          }
          const f = new Man('李四','上海')
          console.log(f.getName())
          復(fù)制代碼
          image.png

          劃重點(diǎn)

          • 要熟練使用箭頭函數(shù),也要對(duì)函數(shù) this(重點(diǎn)) 敏感
          • Vue組件本質(zhì)上是一個(gè) JS 對(duì)象;React 組件(非Hooks)他本質(zhì)上是一個(gè) ES6 的 class,兩者不同

          The end

          關(guān)于本文:

          來(lái)源:是洋柿子啊

          https://juejin.cn/post/7103702621369663518

          瀏覽 19
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲色情A片 | 大色鬼在线天堂精品 | 3区在线观看| 天天撸夜夜干 | 精品国产亚洲AV |