makeFoo = function() { var helper = function(x, y) { return x + y }, msgCount = 0 return { receive: function(message) { msgCount++ switch (message.name) { case 'add': return helper(message.x, message.y) case 'sub': return helper(message.x, -message.y) case 'stats': return alert('message count = ' + msgCount) default: throw 'message not understood: ' + message.name } } } } foo = makeFoo() foo.receive({name: "add", x: 35, y: 7}) foo.receive({name: "sub", x: 3, y: 4}) foo.receive({name: "stats"}) makeFoo = function() { var helper = function(x, y) { return x + y }, msgCount = 0 return function(message) { msgCount++ switch (message.name) { case 'add': return helper(message.x, message.y) case 'sub': return helper(message.x, -message.y) case 'stats': return alert('message count = ' + msgCount) default: throw 'message not understood: ' + message.name } } } foo = makeFoo() foo({name: "add", x: 35, y: 7}) foo({name: "sub", x: 3, y: 4}) foo({name: "stats"})