-
-
Save tobi/911797 to your computer and use it in GitHub Desktop.
var ary = ['a', 'b', 'c']; | |
var funcs = []; | |
for (var i = 0; i < ary.length; i++) { | |
var c = ary[i] | |
funcs.push(function() { console.log(c) }) | |
}; | |
for (var i = 0; i < funcs.length; i++) { | |
funcs[i](); | |
}; |
They explain the issues under the "Closures" section: http://bonsaiden.github.com/JavaScript-Garden/#function.closures
And this is prob what you want :)
http://jsfiddle.net/jboesch26/VWKX7/1/
Further reading about it... http://www.mennovanslooten.nl/blog/post/62
This is one reason I like forEach and other functional friends...
ary.forEach(function(c) {
funcs.push(function() { console.log(c); });
});
...will work how you want. Or even better:
var funcs = ary.map(function(c) {
return function() { console.log(c); };
});
Older browsers don't have these functions, but they can easily be added: https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js#L182-210
If performance is critical you may want to use the traditional for loop, since using forEach incurs a function call per item.
I wish something like this would work but it doesn't quite...
var funcs = ary.map(console.log.bind);
I think, the same c is visible to all function, which have the latest assigned value.
as variable scope in javaScripts is only function level so you can initialize var c in function that will work,
funcs.push(function() { var c = ary[i]; console.log(c) })
fascinating!