Who am I? • Kris Jordan • Founder at New Media Campaigns • Ping me via... • Twitter: @KrisJordan • GitHub: KrisJordan • Email: [email protected] • KrisJodan.com @KrisJordan Tuesday, January 24, 12
Functions can be passed to Executor functions. var executor = function(aFunction){ aFunction(); } executor(logMessage); $executor = function($aFunction){ $aFunction(); }; $executor($logMessage); Tuesday, January 24, 12
jQuery’s API is awesome thanks to Executor functions. $(‘h1’).click(function(){ console.log(“Hello, world”); }); @KrisJordan $(“p”).each(function(){ $(this).wrap(“”); }); Tuesday, January 24, 12
Executor Function Anonymous Function Function Variable var toggleSelected = function(){ $(this).toggleClass(“selected”); }; $(‘h1’).click(toggleSelected); @KrisJordan Tuesday, January 24, 12
Executor Function Anonymous Function Function Variable Generator Function var toggleClass = function(klass){ return function(){ $(this).toggleClass(klass); }; }; $(‘h1’).click(toggleClass(“selected”)); Tuesday, January 24, 12
Functions can be returned by Generator functions. var genMessageFn = function(msg) { return function(){console.log(msg);}; }; jQuery(‘h1’).click(genMessageFn(“Hi!”)); $genMessageFn = function($msg) { return function()use($msg){echo($msg);}; }; $executor($genMessageFn(“Hi!”)); Tuesday, January 24, 12
Functions can be closures. They “trap” var refs into a fn’s scope. JS closures are implicit. PHP closures are explicit. function() use($msg) {...} Tuesday, January 24, 12
Executor Function Anonymous Function var toggleClass = function(klass){ return function(){ $(this).toggleClass(klass); }; }; $(‘h1’).click(toggleClass(“selected”)); Function Variable Generator Function “Trapped” in Scope by Closure Tuesday, January 24, 12
Refactor to Generator @KrisJordan Anonymous Function Function Variable Generator Function refactor for reuse refactor for parameters Tuesday, January 24, 12
var toggleClassSelected = function(){ $(this).toggleClass(“selected”); }; $(‘h1’).click(toggleClassSelected); $(‘h1’).click(function(){ $(this).toggleClass(“selected”); }); var toggleClass = function(klass){ return function(){ $(this).toggleClass(klass); }; }; $(‘h1’).click(toggleClass(“selected”)); Anon Function Function Variable Generator Function refactor for reuse refactor for parameters refactor for reuse refactor for parameters Tuesday, January 24, 12
Let’s Implement a SQL DSL SELECT p.first, p.last, p.games, p.points FROM players AS p WHERE p.games = 19 ORDER BY p.last @KrisJordan Tuesday, January 24, 12
Let’s Implement a SQL DSL SELECT p.first, p.last, p.games, p.points FROM players AS p WHERE p.games = 19 ORDER BY p.last _.filter _.sortBy _.map _.map @KrisJordan Tuesday, January 24, 12
Recap • Functions are data • Closures “trap” variable references in scope, useful for generating functions • Write singular function generators, leverage with plural executor functions • Underscore provides great executor functions for processing data @KrisJordan Tuesday, January 24, 12