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: