Variables passed to closure by reference. This code:
var figs = ['circle', 'square'];
for (var i in figs) {
    var fig = figs[i];
    document.getElementById(fig).addEventListener("click", function(e) {
        console.log(fig);
    }, false);
}
always log last array element even you click to circle (square, last value of fig variable).
In order to bind actual value of fig variable I use wrapping in function call (so intermediate closure hold loop value):
var figs = ['circle', 'square'];
for (var i in figs) {
    var fig = figs[i];
    document.getElementById(fig).addEventListener("click", (function(fig) {
        return function(e) {
            console.log(fig);
        }
    })(fig), false);
}
Is that possible to avoid wrapping-function in order to pass by value?
UPDATE related questions and answers:
 
     
     
    