Created
April 9, 2011 21:32
-
-
Save tobi/911797 to your computer and use it in GitHub Desktop.
wtf.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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](); | |
}; |
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) })
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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