代码之家  ›  专栏  ›  技术社区  ›  0TTT0

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

  •  0
  • 0TTT0  · 技术社区  · 5 年前


    这个回调是实际回调的包装。
    我在最外层的函数中定义了一个变量, 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 回复  |  直到 5 年前
        1
  •  0
  •   Shubham Khatri    5 年前

    根据MDN的定义

    闭包是函数和词汇环境的结合

    根据上述定义, listenCallback 在声明自身时,在其词法作用域中没有声明。 listenWrapperFrom 将从其闭包接收声明变量的位置,而不是引用变量的位置。

    为了解决这个问题,您可以在 listenCallbackFrom 方法

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