我有一些这样的代码:
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_id
闭包中可能会导致问题,因为它是一个可变变量。
我怎样才能避免这种情况呢?我的意思是我怎么能发送一个不可变的变量到回调,因为这是一个 for 循环,我无法更改代码zlib.gzip
?或者换句话说,我如何将参数传递给闭包?
您需要创建一个范围才能正确捕获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]];
...
});
})();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)