How to avoid access mutable variable from closure

closures, javascript, node.js

Solution

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.

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]];
           ...
       });
   })();
}

Problem

I have some code like this: ``` 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]]; ... }); } ``` And I got a warning that using `tmp_id` in closure may cause problem because it is a mutable variable. 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?

Original source

Related problems