<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>

          ES6 箭頭函數(shù)你正確使用了嗎

          共 3141字,需瀏覽 7分鐘

           ·

          2021-07-19 17:12

          作者:歸子莫

          來源:SegmentFault 思否社區(qū)

          ES6 箭頭函數(shù)你正確使用了嗎

          博客說明

          文章所涉及的資料來自互聯(lián)網(wǎng)整理和個(gè)人總結(jié),意在于個(gè)人學(xué)習(xí)和經(jīng)驗(yàn)匯總,如有什么地方侵權(quán),請(qǐng)聯(lián)系本人刪除,謝謝!

          說明

          在ES6中允許使用“箭頭”(=>)定義函數(shù),所以在我們后續(xù)寫代碼的過程中出現(xiàn)的很多的箭頭函數(shù),因?yàn)檎嫦悖〉且矌淼囊恍﹩栴},靈魂拷問,你真的了解箭頭函數(shù)嗎?因?yàn)椴桓铱隙ㄗ鞔穑蚀藭?/span>

          箭頭函數(shù)

          一個(gè)簡(jiǎn)單箭頭函數(shù)
          // es6
          const hello = item => item;

          // es5 上面的代碼等同于
          const hello = function (item) {
            return item;
          };
          用法(三大如果)

          如果箭頭函數(shù)不需要參數(shù)或需要多個(gè)參數(shù),就使用一個(gè)圓括號(hào)代表參數(shù)部分。

          const hello = () => 'hello';

          const sum = (num1, num2) => num1 + num2;

          如果箭頭函數(shù)的代碼塊部分多于一條語句,就要使用大括號(hào)將它們括起來,并且使用return語句返回。

          const sum = (num1, num2) => { 
            let num = 0; 
            if(num1 && num2){
              num = num1 + num2;
            }
            return num;
          }

          如果箭頭函數(shù)直接返回一個(gè)對(duì)象,必須在對(duì)象外面加上括號(hào),否則會(huì)報(bào)錯(cuò)。

          const getInfo = id => ({ id: id, name: "hello" });

          四大注意點(diǎn)

          以下四點(diǎn)可能被無數(shù)次的提及,并且出現(xiàn)在各大面試題當(dāng)中,不錯(cuò),今天又來了一次。

          • 箭頭函數(shù)沒有自己的this對(duì)象
          • 不可以當(dāng)作構(gòu)造函數(shù),不可以使用new命令
          • 不可以使用arguments對(duì)象,該對(duì)象在函數(shù)體內(nèi)不存在。如果要用,可以用 rest 參數(shù)代替
          • 不可以使用yield命令,因此箭頭函數(shù)不能用作 Generator 函數(shù)

          箭頭函數(shù)的this指向

          對(duì)于普通函數(shù)來說,內(nèi)部的this指向函數(shù)運(yùn)行時(shí)所在的對(duì)象。箭頭函數(shù)沒有自己的this對(duì)象,內(nèi)部的this就是定義時(shí)上層作用域中的this
          箭頭函數(shù)內(nèi)部的this指向是固定的,相比之下,普通函數(shù)的this指向是可變的。
          將ES6轉(zhuǎn)成ES5
          發(fā)現(xiàn)其實(shí)只是所謂的箭頭函數(shù)的this只是從外面”借“來的
          // ES6
          function foo() {
            setTimeout(() => {
              console.log('id:', this.id);
            }, 100);
          }

          // ES5
          function foo() {
            var _this = this;

            setTimeout(function () {
              console.log('id:', _this.id);
            }, 100);
          }
          在setInterval中,其實(shí)是沒有this.s2的,所以它的值不會(huì)變化。
          function test() {
            this.s1 = 0;
            this.s2 = 0;
            // 箭頭函數(shù)
            setInterval(() => this.s1++, 1000);
            // 普通函數(shù)
            setInterval(function () {
              this.s2++;
            }, 1000);
          }

          s1 // 1
          s2 // 0
          普通函數(shù)修改之后可以修改s2
          // 普通函數(shù)
          setInterval(function () {
              let _this = this;
            _this.s2++;
          }, 1000);
          在這里也能看到箭頭函數(shù)的this的指向,可以發(fā)現(xiàn)箭頭函數(shù)非常適合來做回調(diào)

          不能作為構(gòu)造函數(shù)

          不能作為構(gòu)造函數(shù),這個(gè)好理解。因?yàn)榧^函數(shù)根本沒有自己的this,拿甚構(gòu)造?所以箭頭函數(shù)也就不能用作構(gòu)造函數(shù)。也不能使用new關(guān)鍵詞。

          不可以使用arguments對(duì)象

          像this一樣,arguments指向外層函數(shù)的對(duì)應(yīng)變量,像類似的兄弟還有supernew.target
          function hello() {
            setTimeout(() => {
              console.log('args:', arguments);
            }, 1000);
          }

          hello(1,2,3,4)
          // args: [1, 2, 3, 4]
          也因?yàn)檫@個(gè)this的問題,箭頭函數(shù)也不能用call()apply()bind()這些方法去改變this的指向,因此箭頭函數(shù)的this是”靜態(tài)“的。

          箭頭函數(shù)的好與壞

          說到箭頭函數(shù)的this,導(dǎo)致這個(gè)沒有那個(gè)沒有,其實(shí)不然,在ES6之前的this對(duì)象一直是一個(gè)令人頭痛的問題,使用時(shí)小心翼翼,回調(diào)一多,代碼就糊了。正是因?yàn)檫@個(gè)”靜態(tài)“的this的出現(xiàn),改善了這一些問題。
          在使用箭頭函數(shù)的時(shí)候,要合理的利用箭頭函數(shù)的優(yōu)劣,選擇合適的場(chǎng)景。在定義對(duì)象方法和動(dòng)態(tài)綁定this的時(shí)候不要使用箭頭函數(shù)。


          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 38
          點(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 V | 无码影音先锋 | 国内精久久久久久久久久久 |