闭包变量未定义:如何在 JS 中访问外部变量?
Closure variable undefined: How to access outer variables in JS?
我有一个响应回调的事件侦听器。
此回调是实际回调的包装器。
我在最外层的函数中定义了一个变量,blockNumber
,并想从最内层的函数中访问它(read/write)。
代码如下
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定义
A closure is the combination of a function and the lexical environment
within which that function was declared.
所以按照上面的定义,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();
}
}
我有一个响应回调的事件侦听器。
此回调是实际回调的包装器。
我在最外层的函数中定义了一个变量,blockNumber
,并想从最内层的函数中访问它(read/write)。
代码如下
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定义
A closure is the combination of a function and the lexical environment within which that function was declared.
所以按照上面的定义,listenCallback
在声明它自己的时候并没有在它的词法范围内声明一个。 listenWrapperFrom
或 listenCallback
将从闭包中声明变量的地方接收变量,而不是从引用它们的地方接收变量。
为了解决这个问题,您可以在 listenCallbackFrom
和 listenCallback
方法
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();
}
}