闭包变量undefined:如何在JS中访问外部变量?

问题描述 投票:0回答:1

我有一个响应回调的事件监听器。 这个回调是实际回调的包装器。 我在最外面的函数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它是一个未定义的变量。

qazxsw poi是最外面的功能, 它有一个调用qazxsw poi的事件监听器, 它在这个回调中,我试图回到最外面的范围。

javascript scope closures wrapper
1个回答
-1
投票

根据MDN的定义

闭包是函数和声明该函数的词法环境的组合。

因此,按照上面的定义,startWeb3在声明自己的词法范围时没有声明。 listenCallbacklistenCallback将从声明的闭包中接收变量,而不是它们被引用的位置。

为了解决这个问题,你可以在listenWrapperFromlistenCallback方法的词法范围中定义blockNumber。

listenCallbackFrom
© www.soinside.com 2019 - 2024. All rights reserved.