我有一些这样的代码:
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闭包是可变变量,所以可能会引起问题。
tmp_id
我该如何避免呢?我的意思是我如何将不可变变量发送给回调,因为这是一个for循环,并且我无法更改代码zlib.gzip?换句话说,如何将参数传递给闭包?
zlib.gzip
您需要创建一个范围以tmp_id使用自执行功能正确捕获。这是因为整个for循环是一个作用域,也就是说,每次循环都捕获相同的变量。因此,回调将以错误的id结尾,因为temp_id的值将在调用回调之前更改。
temp_id
不过,我会忽略(或关闭)警告,这似乎是在抱怨说由于temp_id可变,您可能会重新分配它。真是愚蠢。如果您确实要解决此问题,请尝试使用const关键字代替var。
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]]; ... }); })(); }