Here is my contribution to Jason Bunting's / Alex Nazarov's excellent answers, where I include error checking requested by Crashalot.
Given this (contrived) preamble:
a = function( args ) { console.log( 'global func passed:' ); for( var i = 0; i < arguments.length; i++ ) { console.log( '-> '+ arguments[ i ] ); }};ns = {};ns.a = function( args ) { console.log( 'namespace func passed:' ); for( var i = 0; i < arguments.length; i++ ) { console.log( '-> '+ arguments[ i ] ); }};name = 'nsa';n_s_a = [ 'Snowden' ];noSuchAgency = function(){};
then the following function:
function executeFunctionByName( functionName, context /*, args */ ) { var args, namespaces, func; if( typeof functionName === 'undefined' ) { throw 'function name not specified'; } if( typeof eval( functionName ) !== 'function' ) { throw functionName +' is not a function'; } if( typeof context !== 'undefined' ) { if( typeof context === 'object'&& context instanceof Array === false ) { if( typeof context[ functionName ] !== 'function' ) { throw context +'.'+ functionName +' is not a function'; } args = Array.prototype.slice.call( arguments, 2 ); } else { args = Array.prototype.slice.call( arguments, 1 ); context = window; } } else { context = window; } namespaces = functionName.split( "." ); func = namespaces.pop(); for( var i = 0; i < namespaces.length; i++ ) { context = context[ namespaces[ i ] ]; } return context[ func ].apply( context, args );}
will allow you to call a javascript function by name stored in a string, either namespaced or global, with or without arguments (including Array objects), providing feedback on any errors encountered (hopefully catching them).
The sample output shows how it works:
// calling a global function without parmsexecuteFunctionByName( 'a' ); /* OUTPUT: global func passed: */// calling a global function passing a number (with implicit window context)executeFunctionByName( 'a', 123 ); /* OUTPUT: global func passed: -> 123 */// calling a namespaced function without parmsexecuteFunctionByName( 'ns.a' ); /* OUTPUT: namespace func passed: */// calling a namespaced function passing a string literalexecuteFunctionByName( 'ns.a', 'No Such Agency!' ); /* OUTPUT: namespace func passed: -> No Such Agency! */// calling a namespaced function, with explicit context as separate arg, passing a string literal and array executeFunctionByName( 'a', ns, 'No Such Agency!', [ 007, 'is the man' ] ); /* OUTPUT: namespace func passed: -> No Such Agency! -> 7,is the man */// calling a global function passing a string variable (with implicit window context)executeFunctionByName( 'a', name ); /* OUTPUT: global func passed: -> nsa */// calling a non-existing function via string literalexecuteFunctionByName( 'n_s_a' ); /* OUTPUT: Uncaught n_s_a is not a function */// calling a non-existing function by string variableexecuteFunctionByName( n_s_a ); /* OUTPUT: Uncaught Snowden is not a function */// calling an existing function with the wrong namespace referenceexecuteFunctionByName( 'a', {} ); /* OUTPUT: Uncaught [object Object].a is not a function */// calling no functionexecuteFunctionByName(); /* OUTPUT: Uncaught function name not specified */// calling by empty stringexecuteFunctionByName( '' ); /* OUTPUT: Uncaught is not a function */// calling an existing global function with a namespace referenceexecuteFunctionByName( 'noSuchAgency', ns ); /* OUTPUT: Uncaught [object Object].noSuchAgency is not a function */