Javascript 未定义闭包变量:如何访问JS中的外部变量?

Javascript 未定义闭包变量:如何访问JS中的外部变量?,javascript,scope,closures,wrapper,Javascript,Scope,Closures,Wrapper,我有一个事件侦听器,它通过回调进行响应。 此回调是实际回调的包装。 我在最外层的函数中定义了一个变量,blockNumber,并希望从最内层的函数中访问它(读/写) 代码如下 startWeb3 = async () => { await initWeb3(); var blockNumber = await web3.eth.getBlockNumber(); console.log(blockNumber) //=> "184" window.KYCinst

我有一个事件侦听器,它通过回调进行响应。
此回调是实际回调的包装。
我在最外层的函数中定义了一个变量,
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


正是在这个回调中,我试图返回最外层的作用域。

根据MDN的定义

闭包是函数和词汇环境的组合 其中声明了该函数

因此,按照上面的定义,
listenCallback
在声明自身时,在其词法范围中没有声明
listenWrapperFrom
listenCallback
将从其闭包中接收变量,这些变量声明在哪里,而不是引用在哪里

为了解决这个问题,您可以在
listenCallbackFrom
listenCallback
方法的词法范围内定义blockNumber

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();
  }
}

根据MDN的定义

闭包是函数和词汇环境的组合 其中声明了该函数

因此,按照上面的定义,
listenCallback
在声明自身时,在其词法范围中没有声明
listenWrapperFrom
listenCallback
将从其闭包中接收变量,这些变量声明在哪里,而不是引用在哪里

为了解决这个问题,您可以在
listenCallbackFrom
listenCallback
方法的词法范围内定义blockNumber

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();
  }
}

你能更清楚地知道这里哪个函数是你的
最里面的
,哪个是最外面的?你能更清楚地知道这里哪个函数是你的
最里面的
,哪个是最外面的?