第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

有沒有辦法使用命名箭頭函數(shù)來維護(hù)對(duì)象內(nèi)的詞法范圍?

有沒有辦法使用命名箭頭函數(shù)來維護(hù)對(duì)象內(nèi)的詞法范圍?

郎朗坤 2022-09-23 10:07:37
描述: 我正在使用并希望調(diào)用一個(gè)命名函數(shù)(不是匿名函數(shù)),因?yàn)槲蚁M軌蛟谝院蟮碾A段使用 removeEventListener。但是,事件處理程序(即箭頭函數(shù))的內(nèi)部顯示“this”仍指向窗口對(duì)象而不是游戲?qū)ο蟆indow.addEventListener()console.logPS:在我重構(gòu)這個(gè)時(shí)忽略代碼的其他部分,其余的可能仍然不完整,我知道我可以使用構(gòu)造函數(shù),但我處于學(xué)習(xí)階段,在我研究構(gòu)造函數(shù)之前,我想看看是否可以在沒有構(gòu)造函數(shù)的情況下完成此操作function makeGameObject() {  return {    score: 0,    level: 1,    start() {      for (let coin of coins) {        this.moveCoin(coin);      }      window.addEventListener("keydown", this.gameOn)    },    stop() {      window.removeEventListener("keydown", this.gameOn);    },    gameOn: (evt) => {      console.log(this);      if (evt.key.toUpperCase() === "W" || evt.key === "ArrowUp") {        this.moveObject(player, 30, 'up');      } else if (evt.key.toUpperCase() === "S" || evt.key === "ArrowDown") {        this.moveObject(player, 30, 'down');      } else if (evt.key.toUpperCase() === "A" || evt.key === "ArrowLeft") {        this.moveObject(player, 30, 'left');        player.style.transform = 'scale(-1,1)';      } else if (evt.key.toUpperCase() === "D" || evt.key === "ArrowRight") {        this.moveObject(player, 30, 'right');        player.style.transform = 'scale(1,1)';      }      for (let coin of coins) {        if (this.isTouching(player, coin)) {          this.moveCoin(coin);          score++;          h1.innerText = score;        }      }    },下面是對(duì)函數(shù)的調(diào)用:const player = document.querySelector("#player");const coins = document.querySelectorAll(".coin");const body = document.querySelector("body");const h1 = document.querySelector("h1");const game = makeGameObject();game.start();
查看完整描述

1 回答

?
牛魔王的故事

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊

一種方法是動(dòng)態(tài)創(chuàng)建 的綁定版本并改用它:gameOn()


{

  // ...


  start() {

    for (let coin of coins) {

      this.moveCoin(coin);

    }

    if (this.boundGameOn === undefined) {

      this.boundGameOn = this.gameOn.bind(this);

    }

    window.addEventListener("keydown", this.boundGameOn)

  },


  stop() {

    window.removeEventListener("keydown", this.boundGameOn);

  },


  // ...

}

理想情況下,您會(huì)在構(gòu)造函數(shù)中執(zhí)行此操作。如果你有一個(gè)構(gòu)造函數(shù)而不是一個(gè)對(duì)象文本,你可以這樣做:


function GameObject () {

  this.boundGameOn = this.gameOn.bind(this)

}


GameObject.prototype = {

  // rest of code ..

}

事實(shí)上,在 React 應(yīng)用程序中,看到這種設(shè)計(jì)模式并不少見:


function GameObject () {

  this.gameOn = this.gameOn.bind(this); // MAGIC!!

}


GameObject.prototype = {

  // ...


  start() {

    for (let coin of coins) {

      this.moveCoin(coin);

    }

    window.addEventListener("keydown", this.gameOn)

  },


  stop() {

    window.removeEventListener("keydown", this.gameOn);

  },


  // ...

}

MAGIC 行確保內(nèi)部始終指向游戲?qū)ο?,因?yàn)槟谟闷渥陨淼慕壎ò姹靖采w它。thisgameOn()


這在ES6類語法中看起來稍微干凈一些(只是稍微有點(diǎn),我個(gè)人對(duì)這兩種語法都沒有偏好):


class GameObject {


  constructor () {

    this.gameOn = this.gameOn.bind(this); // MAGIC!!

  }


  // ...


  start() {

    for (let coin of coins) {

      this.moveCoin(coin);

    }

    window.addEventListener("keydown", this.gameOn)

  }


  stop() {

    window.removeEventListener("keydown", this.gameOn);

  }


  // ...

}

使用為ES7提出的實(shí)驗(yàn)性類屬性語法,它甚至更簡(jiǎn)單:你可以只使用箭頭函數(shù)(現(xiàn)在不要直接使用它,2020年中期,因?yàn)镾afari不支持這個(gè),但如果你使用Babel或Typescript,你可以編譯到ES6):


class GameObject {

  // ...


  start = () => {

    for (let coin of coins) {

      this.moveCoin(coin);

    }

    window.addEventListener("keydown", this.gameOn)

  }


  stop = () => {

    window.removeEventListener("keydown", this.gameOn);

  }


  // ...

}

在本例中由箭頭函數(shù)綁定。this


查看完整回答
反對(duì) 回復(fù) 2022-09-23
  • 1 回答
  • 0 關(guān)注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)