Last active
November 24, 2018 21:00
-
-
Save atomize/94a122d2cc55ab1dfb1df68eb039fa0a to your computer and use it in GitHub Desktop.
Execute function by name string and context (window/namespace)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Example of how to use executeFunctionByName() | |
// question: https://stackoverflow.com/q/359788 | |
// answer: https://stackoverflow.com/a/42171078 | |
// via user: https://stackoverflow.com/users/2158270/mac | |
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(){}; | |
// calling a non-existing function via string literal | |
executeFunctionByName( 'n_s_a' ); | |
/* OUTPUT: | |
Uncaught n_s_a is not a function | |
*/ | |
// calling a non-existing function by string variable | |
executeFunctionByName( n_s_a ); | |
/* OUTPUT: | |
Uncaught Snowden is not a function | |
*/ | |
// calling an existing function with the wrong namespace reference | |
executeFunctionByName( 'a', {} ); | |
/* OUTPUT: | |
Uncaught [object Object].a is not a function | |
*/ | |
// calling no function | |
executeFunctionByName(); | |
/* OUTPUT: | |
Uncaught function name not specified | |
*/ | |
// calling by empty string | |
executeFunctionByName( '' ); | |
/* OUTPUT: | |
Uncaught is not a function | |
*/ | |
// calling an existing global function with a namespace reference | |
executeFunctionByName( 'noSuchAgency', ns ); | |
/* OUTPUT: | |
Uncaught [object Object].noSuchAgency is not a function | |
*/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// question: https://stackoverflow.com/q/359788 | |
// answer: https://stackoverflow.com/a/42171078 | |
// via user: https://stackoverflow.com/users/2158270/mac | |
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 ); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment