Quantcast
Channel: How to execute a JavaScript function when I have its name as a string - Stack Overflow
Viewing all articles
Browse latest Browse all 38

Answer by Mac for How to execute a JavaScript function when I have its name as a string

$
0
0

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  */

Viewing all articles
Browse latest Browse all 38

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>