Skip to content

Instantly share code, notes, and snippets.

@EscApp2
Created December 24, 2024 08:34
Show Gist options
  • Save EscApp2/e2602591fbe522df685ac4190c61b63f to your computer and use it in GitHub Desktop.
Save EscApp2/e2602591fbe522df685ac4190c61b63f to your computer and use it in GitHub Desktop.
execute Function from string
function executeFunction(string, context /*, args*/){
/*
* https://stackoverflow.com/questions/7650071/is-there-a-way-to-create-a-function-from-a-string-with-javascript
* https://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string
* */
var args = Array.prototype.slice.call(arguments, 2);
if(!context){
context = window;
}
if(typeof string == "string"){
let trim = function (str, charlist) {
// discuss at: https://locutus.io/php/trim/
// original by: Kevin van Zonneveld (https://kvz.io)
// improved by: mdsjack (https://www.mdsjack.bo.it)
// improved by: Alexander Ermolaev (https://snippets.dzone.com/user/AlexanderErmolaev)
// improved by: Kevin van Zonneveld (https://kvz.io)
// improved by: Steven Levithan (https://blog.stevenlevithan.com)
// improved by: Jack
// input by: Erkekjetter
// input by: DxGx
// bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)
// example 1: trim(' Kevin van Zonneveld ')
// returns 1: 'Kevin van Zonneveld'
// example 2: trim('Hello World', 'Hdle')
// returns 2: 'o Wor'
// example 3: trim(16, 1)
// returns 3: '6'
let whitespace = [
' ',
'\n',
'\r',
'\t',
'\f',
'\x0b',
'\xa0',
'\u2000',
'\u2001',
'\u2002',
'\u2003',
'\u2004',
'\u2005',
'\u2006',
'\u2007',
'\u2008',
'\u2009',
'\u200a',
'\u200b',
'\u2028',
'\u2029',
'\u3000',
].join('')
let l = 0
let i = 0
str += ''
if (charlist) {
whitespace = (charlist + '').replace(/([[\]().?/*{}+$^:])/g, '$1')
}
l = str.length
for (i = 0; i < l; i++) {
if (whitespace.indexOf(str.charAt(i)) === -1) {
str = str.substring(i)
break
}
}
l = str.length
for (i = l - 1; i >= 0; i--) {
if (whitespace.indexOf(str.charAt(i)) === -1) {
str = str.substring(0, i + 1)
break
}
}
return whitespace.indexOf(str.charAt(0)) === -1 ? str : ''
}
let execute_function_by_name = function(functionName, context, args ){
var namespaces = functionName.split(".");
var func = namespaces.pop();
for(var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
if(!!context[func]){
return context[func].apply(context, args);
}
return null;
};
let is_anon_function = function (string) {
var funcReg = /function *\(([^()]*)\)[ \n\t]*{(.*)}/gmi;
var match = funcReg.exec(string.replace(/\n/g, ' '));
if(match) {
let args = match[1].split(',')
return {
'function':new Function(args, match[2]),
'args':args,
}
}
return null;
};
let is_function_name_with_param = function (string) {
var funcReg = /([^(]*) *\(([^()]*)\)/gmi;
var match = funcReg.exec(string.replace(/\n/g, ' '));
if(match) {
let args = match[2].split(',');
args.forEach((element, index) => {
element = trim(element,'"');
element = trim(element,"'");
args[index] = element;
});
return {
'function_name':match[1],
'args':args,
}
}
return null;
};
let res = is_anon_function(string);
if(!!res && res['function']){
return res['function'].apply(context,res['args']);
}else{
res = is_function_name_with_param(string);
if(!!res && res['function_name']){
execute_function_by_name(res['function_name'], context, res['args']);
}else{
execute_function_by_name(string, context, args);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment