closure
var counter = (function() { //exposed function references private state (the outer function’s scope / lexical environment) after outer returns. var privateCounter = 0; function changeBy(val) { privateCounter += val; } return { increment: function() {changeBy(1); }, decrement: function() {changeBy(-1);}, value: function() {return privateCounter; } }; })(); counter.increment(); counter.increment(); counter.decrement(); counter.value(); // 1