一尘不染

如何避免从封闭中访问可变变量

node.js

我有一些这样的代码:

for(var id=0; id < message.receiver.length; id++){
   var tmp_id = id;
   zlib.gzip(JSON.stringify(message.json), function(err, buffer){
                        ...
   pushStatusPool[message.receiver[tmp_id]] = null; // fix memory leak
   delete pushStatusPool[message.receiver[tmp_id]];
   ...
   });
}

而且我收到警告,因为使用tmp_idin闭包是可变变量,所以可能会引起问题。

我该如何避免呢?我的意思是我如何将不可变变量发送给回调,因为这是一个for循环,并且我无法更改代码zlib.gzip?换句话说,如何将参数传递给闭包?


阅读 285

收藏
2020-07-07

共1个答案

一尘不染

您需要创建一个范围以tmp_id使用自执行功能正确捕获。这是因为整个for循环是一个作用域,也就是说,每次循环都捕获相同的变量。因此,回调将以错误的id结尾,因为temp_id的值将在调用回调之前更改。

不过,我会忽略(或关闭)警告,这似乎是在抱怨说由于temp_id可变,您可能会重新分配它。真是愚蠢。如果您确实要解决此问题,请尝试使用const关键字代替var

for(var id=0; id < message.receiver.length; id++){
   (function(){
       const tmp_id = id;
       zlib.gzip(JSON.stringify(message.json), function(err, buffer){
                        ...
           pushStatusPool[message.receiver[tmp_id]] = null; // fix memory leak
           delete pushStatusPool[message.receiver[tmp_id]];
           ...
       });
   })();
}
2020-07-07