Closure

by Jimmy Chandra

JavaScript

var items = [],
    source = [9, 8, 7];

for (var i in source) {    
    items.push(
        function() {                    //IIFE to work around closure issue.
            var item = source[i];       //Extract source value and assign it into IIFE scope
            
            //IIFE will return the function that will output the value which is now bound to IIFE scope
            return function () { 
                console.log(item); 
                
                //DO NOT DO THIS... you will always get 7 since the closure is actually capturing
                //variable i reference and source[2] will always be 7 when it is invoked after
                //the initial loop
                //console.log(source[i]);
            }
        }()    
    );
}

//i should be 2 at the end of this loop, uncomment the next line to proof it..
//console.log("After end of loop above, i is now:", i);

for (var j in items) { 
    items[j]();    //invoke the stored functions.
}

//Better yet... and clearer...

//for each source items, create a function that will write its value
items = source.map(function(s) {
    return function() {
        console.log(s);
    }
});

//run each function in items
items.forEach(function(i) {
    i();
});