Functional Programming in Javascript
Just a random, late night scribble for the boys and girls out there starting fresh with javascript and not understanding the power that you can harness with it. I’ve given this demonstration before, but it’s always fun to post because someone might learn something new.
Anyway, you might be familiar with your usual function definition, let’s say a function that sums 2 numbers:
function sum(a,b){
return a+b;
}
sum(2,5); // returns 7
That’s fine and dandy… but now let’s change this around a bit to better illustrate what a function is:
var pre = function(a,b){
return a+b;
}
sum(2,5); // returns 7
Yep, that’s right… a function is just an object in javascript and the name of it is simply a variable. Now let’s make this a bit more interesting by creating a function that returns a running sum:
function runningSum(start){
var sum = start;
return function(a){
return sum+=a;
}
}
var sum = runningSum(3);
sum(2); // returns 5
sum(10); // returns 15
As you see, you can have a function return another function in javascript, and that function inherits the scope of the function that created it… in fact we could remove the temporary sum variable and get the same results:
function runningSum(start){
return function(a){
return start+=a;
}
}
var sum = runningSum(3);
sum(2); // returns 5
sum(10); // returns 15
now, lets introduce the arguments variable, which gives you access to an array of agu ments passed into the function. A revised sum function:
function sum(){
var sum = 0;
for(var i = 0; i < arguments.length; i++){
sum += arguments[i];
}
return sum;
}
sum(1,2,2,1); // returns six
The arguments object is a pretty damn cool object, if you want to look further, take a gander at the Mozilla documentation. Using the callee attribute of arguments (which returns the function instance itself), we can do something wicked:
var sum = 0;
function add(a){
sum+=a;
return arguments.callee;
}
add(1)(2)(3);
alert(sum); // displays 6
I find this can come in pretty handy when you need an accumulator of some sort… try it, it works!
Also, you can assign the scope of this while using functions, which can be useful if, for example, you want to call a function where this might resolve to the local scope (think ajax callbacks):
function greeting(){
return "Hello " + this.name;
}
var person = {'name':'James'};
greeting.call(person); // returns "Hello James"
I also prefer to avoid polluting the global scope if I want a script that does something procedural when it’s included, in that case I just create a function and execute it on the spot:
(function(){
var bleh = 3;
alert(bleh+5); // alerts 8
})();
alert(bleh); // Reference Error: bleh is not defined
Finally, there’s a handy map function on arrays. It’s available in Mozilla, but not IE (afaik), however it is also available in jquery, so you can give it a try there.
[1,2,3,4,5].map(function(a){return a*a;}); // returns [1,4,9,16,25]
Overall, pretty basic stuff, but a nice refresher if you are unfamiliar. ![]()
If you're new here, you may want to subscribe to my RSS feed. Thanks for visiting!














August 31st, 2009 at 2:24 am
James Carr : Functional Programming in Javascript…
Just a random, late night scribble for the boys and girls out there starting fresh with javascript and not understanding the power that you can harness with it. I’ve given this demonstration before, but it’s always fun to post because someone might…
August 31st, 2009 at 10:56 am
You can do weird metaprogramming-ish stuff like this too. For express https://github.com/visionmedia/express/tree I evaluate the route closures differently to allow the last expression to be the return value instead of having an explicit return, so its more Ruby-like
Havent benchmarked but probably slows things down, looks nice though
http://gist.github.com/178499
August 31st, 2009 at 3:02 pm
You can also do some really fun stuff with the ‘caller’ attribute of the current function, like writing a function that allows you to fake tail recursion and/or do periodic calls to a function, or pause for a specified amount of time before running some more code.
http://probablyprogramming.com/2007/11/18/extending-javascript-tail-recursion/
September 2nd, 2009 at 9:40 pm
Paul, thanks for telling me about that… I did not know that was available, that is truly a neat feature.
And TJ, as always you impress me with some of the things you do with javascript
February 5th, 2010 at 6:44 am
[...] Functional Programming in Javascript [...]
February 6th, 2010 at 10:21 am
[...] Functional Programming in Javascript [...]