我有一个JavaScript函数的名称作为字符串。如何将其转换为函数指针以便稍后调用?
根据具体情况,我可能还需要将各种参数传递到方法中。
一些函数可以采用namespace.namespace.function(args[…])的形式。
我有一个JavaScript函数的名称作为字符串。如何将其转换为函数指针以便稍后调用?
根据具体情况,我可能还需要将各种参数传递到方法中。
一些函数可以采用namespace.namespace.function(args[…])的形式。
当前回答
关于杰森和亚历克斯的帖子还有一个细节。我发现向上下文添加默认值很有帮助。只要写上context = context == undefined?窗口:上下文;在函数的开始。您可以将window更改为您首选的上下文,这样您就不需要每次在默认上下文中调用this时都传入相同的变量。
其他回答
如果你想用window["functionName"]调用一个对象的函数而不是全局函数。你可以这样做;
var myObject=new Object();
myObject["functionName"](arguments);
例子:
var now=new Date();
now["getFullYear"]()
所有答案都假设函数可以通过全局作用域(窗口)访问。然而,OP并没有做出这样的假设。
如果函数存在于局部作用域(即闭包)中,并且没有被其他局部对象引用,那么运气就不好了:你必须使用eval() AFAIK,参见 在javascript中动态调用局部函数
你也可以在eval("functionname as string")中调用javascript函数。(eval是纯javascript函数)
function testfunc(){
return "hello world";
}
$( document ).ready(function() {
$("div").html(eval("testfunc"));
});
工作示例:https://jsfiddle.net/suatatan/24ms0fna/4/
由于eval()是邪恶的,而new Function()不是最有效的方法来实现这一点,这里有一个快速的JS函数,从它的字符串名称返回函数。
适用于命名空间的函数 在null/undefined字符串的情况下回退到null函数 如果没有找到函数,则回退到null函数
function convertStringtoFunction(functionName){ var nullFunc = function(){}; // Fallback Null-Function var ret = window; // Top level namespace // If null/undefined string, then return a Null-Function if(functionName==null) return nullFunc; // Convert string to function name functionName.split('.').forEach(function(key){ ret = ret[key]; }); // If function name is not available, then return a Null-Function else the actual function return (ret==null ? nullFunc : ret); }
用法:
convertStringtoFunction("level1.midLevel.myFunction")(arg1, arg2, ...);
小心! !
在JavaScript中应该尽量避免通过字符串调用函数,原因有两个:
原因1:一些代码混淆器会破坏你的代码,因为它们会改变函数名,使字符串无效。
原因2:维护使用这种方法的代码要困难得多,因为定位字符串调用的方法的用法要困难得多。