Ayende has a post on working with closures in JavaScript. Basically, when looking at capturing variables in a closure, you need to be careful with lexical scope. In JS the scope is a function, so if you want to capture a variable that will change values during the scope of the function, you will need to reference it via another function.
From Ayende’s example, where i is set in a loop, this:
if( nums[i] % 2 == 0) { var tmpNum = nums[i]; alertLink.onclick = function() { alert('EVEN: '+ tmpNum ); }; //tmpNum will be bound to its value when the loop exits. } ...
Needs to become this:
if( nums[i] % 2 == 0) { var act = function(tmpEVEN) { alertLink.onclick = function() { alert('EVEN: '+tmpEVEN); }; }; act(nums[i]); //tmpEVEN will be bound to nums[i] at the point where act(nums[i]) is called. } ...
Ayende notes that in C#, the first example will work as its lexical scope is the current block (I think :S). In JavaScript, we need to use a function to get the correct scope.