Переменная закрытия не определена: как получить доступ к внешним переменным в JS? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть прослушиватель событий, который отвечает обратным вызовом.
Этот обратный вызов является оберткой вокруг фактического обратного вызова.
Я определил переменную в самой внешней функции blockNumber и хочу получить к ней доступ (чтение / запись) из самой внутренней функции.

Код выглядит следующим образом.

startWeb3 = async () => { 
  await initWeb3();

  var blockNumber = await web3.eth.getBlockNumber();
  console.log(blockNumber) //=> "184"

  window.KYCinstance.events.ReportedFraudA({ fromBlock:0 }, 
  (error, event) => {
    console.log(blockNumber); //=> "184"
    listenCallback(error, event, "fromFraudEvents");
  });

listenCallback = async (error, event, type) => {
  if (error) { console.log(error); }
  else {
    console.log(blockNumber); //=> "ERROR"
  }
}

В результате появляется сообщение об ошибке, и, конечно, если я делаю this.blockNumber, оно не определенопеременная.

startWeb3 является самой внешней функцией,
она имеет прослушиватель событий, который вызывает listenCallback,
, она находится внутри этого обратного вызова, где я пытаюсь получить доступ к самой внешней области видимости.

1 Ответ

0 голосов
/ 25 марта 2019

Согласно определению MDN

Закрытие - это комбинация функции и лексического окружения, в котором эта функция была объявлена.

Итак, исходя из вышеизложенногоПо определению, listenCallback не имеет объявленного в своей лексической области, когда оно объявлено само.listenWrapperFrom или listenCallback будут получать переменные из своего закрытия, где они объявлены, а не там, где на них ссылаются.

Чтобы решить эту проблему, вы можете определить blockNumber в лексической области видимости listenCallbackFrom и listenCallback method

var blockNumber;

listenToEvent = async () => { 

  blockNumber = await web3.eth.getBlockNumber();

  KYCinstance.events.ReportedFraudA({ fromBlock:0 }, listenWrapperFrom); 

};

function listenWrapperFrom(error, event) {
  listenCallback(error, event, "fromFraudEvents");
}

async function listenCallback (error, event, type) {
  if (error) { console.log(error); }
  else {
    console.log(blockNumber);
    let value = await someFunction();
  }
}
...