如何避免从闭包中访问可变变量 [英] How to avoid access mutable variable from closure

查看:78
本文介绍了如何避免从闭包中访问可变变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些这样的代码:

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 在闭包可能会导致问题,因为它是一个可变变量。

And I got a warning that using tmp_id in closure may cause problem because it is a mutable variable.

我如何避免呢?我的意思是如何发送一个不可变的变量回调,因为这是一个for循环,我不能改变代码 zlib.gzip

How could I avoid that? I mean how could I send an immutable variable to callback since this is a for loop and I can not change code of zlib.gzip? Or in other words, how could I pass a argument to a closure?

推荐答案

你需要创建一个范围来正确捕获 tmp_id 使用自执行功能。这是因为整个for循环是一个范围,意味着每次通过,你捕获相同的变量。因此,回调将以错误的id结束,因为 temp_id 的值将在调用回调之前更改。

You need to create a scope to correctly capture tmp_id using a self-executing function. That's because the entire for loop is one scope, meaning each time through, you're capturing the same variable. So the callback will end up with the wrong ids, because temp_id's value will get changed before the callback is called.

我忽略(或关闭)警告,虽然,这似乎是抱怨,因为 temp_id 是可变的,你可以重新分配。这是一个愚蠢。如果你真的想修复它,尝试使用 const 关键字而不是 var

I'd ignore (or shut off) the warning, though, which seems to be complaining that because temp_id is mutable, you might reassign it. That's sort of silly. If you really want to fix it, try using the const keyword instead of 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]];
           ...
       });
   })();
}

这篇关于如何避免从闭包中访问可变变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆