One could think that using a traditional for loop to iterate an array vs using the (relatively) new forEach method is just a matter of style, but I just realized today how handy the second approach comes for a rather particular case.
In this old post where I pondered about the usage of closures inside loops in C# and JavaScript, we could see how convoluted properly doing it in JavaScript could be, having to define an extra function. However, using the forEach method, as we already need a function for the iteration body, it seems pretty much more natural, just look the code below:
var buttons = [
{text: "Open"},
{text: "Save"},
{text: "Exit"}
];
//------------------------------------------------
//this is the wrong way to do it, all closures trap the same "i" variable, so in the end, the value is 3 for all of them
for (var i=0; i<buttons.length; i++){
buttons[i].click = function(){
console.log(this.text + " is button " + i);
};
}
buttons[0].click(); //prints 3
buttons[1].click(); //prints 3
//------------------------------------------------
//this options was fine, but the code is not too clean
for (var i=0; i<buttons.length; i++){
buttons[i].click = (function(){
var j = i;
return function(){
console.log(this.text + " is button " + j);
}
}());
}
buttons[0].click(); //prints 0
buttons[1].click(); //prints 1
//------------------------------------------------
//I bet this is much cleaner than the above
buttons.forEach(function(button, index){
button.click = function(){
console.log(this.text + " is button " + index);
};
});
buttons[0].click(); //prints 0
buttons[1].click(); //prints 1
No comments:
Post a Comment