我搜索过并发现了很多关于此问题的讨论,但似乎没有任何解决方案可行。
方案: 我有一个处理复杂计算器的中央脚本。这个计算器有超过1000个独立的计算器,每个计算器都通过一个函数调用。
这些功能中的每一个都是根据用户选择动态加载的(保持开销等......)
因此,核心脚本与此类似:
var m1 = 5;
var m2 = 8;
dynamicfunction1();
dynamicfunction2();
var m3 = m1 + m2;
动态函数可以更改m1的值,例如,取决于条件(我保持示例简短)。
所以,我想在运行之前首先检查函数是否存在,如果没有,请忽略它。
所以,我打算:
FncChk("dynamicfunction1");
FncChk("dynamicfunction2");
下面是我创建了一个函数但尝试测试2(显然1不存在)的示例。问题出现在window [](应用而不是eval();)我似乎无法将字符串转换为函数名来执行它。
function MonkeysEatBananas() {
alert("Function triggered, Monkeys are eating bananas");
}
function FncChk(FuncName) {
var fn = window[FuncName];
alert(fn + "---> " + FuncName);
if (typeof fn == "function" ){alert("Run function hetttre");}else{alert("Function "+FuncName+" not loaded");}
}
}
FncChk("MinionsEatBananas");
FncChk("MonkeysEatBananas");
我可以使用内联语句将函数验证为函数,如:
if( typeof MonkeysEatBananas == "function" ){alert("Run function here");}else{alert("Function "+FuncName+" not loaded");}
但是当我将它包装在更广泛的用户和更少代码的函数中时。我只是知道我做了一些愚蠢的事情,但是我已经杀了几个小时了,因此有时间点火!任何朝着正确方向踢的人都会赞赏。
答案 0 :(得分:1)
只要该功能是全局的,您就可以直接使用window["functionName"]
。
要测试函数是否使用typeof window["functionName"] == "function"
并执行,只需添加()
即可。
function abc() { console.log("abc")}
function runFunc(f)
{
var fn = window[f];
//console.log(fn)
if (typeof fn == "function") fn(); else console.log(f + " not found")
}
runFunc("abc");
runFunc("def");
jquery
版本几乎相同:
function abc() { console.log("abc")}
function runFunc(f)
{
var fn = window[f];
if ($.isFunction(fn)) fn(); else console.log(f + " not found")
}
runFunc("abc");
runFunc("def");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
如果您使用名称空间,您可以执行相同操作,但只使用对象而不是window
(取决于您如何实现名称空间,下面是基本对象示例):
var calc = {};
calc.abc = function() { console.log("abc") }
calc.runFunc = function(f) {
var fn = calc[f];
if (typeof fn === "function") fn();
else console.log(f + " not found")
}
calc.runFunc("abc");
calc.runFunc("def");
// global namespace (window) now only has 'calc' and not all the calc functions
console.log("window[abc] = " + window["abc"]);
// can also call directly
calc.abc();
这是使用自执行函数的另一种命名空间方法(或者,如果你是一个坚持者:立即调用函数表达式(IIFE))
var calc = (function() {
var publicScope = {};
//Public method
publicScope.runFunc = function(f) {
var fn = methods[f];
if (typeof fn === "function") fn();
else console.log(f + " not found")
};
var methods = {};
//Private method
methods.abc = function () {
console.log("abc");
}
//Return only the public parts
return publicScope;
}());
calc.runFunc("abc");
calc.runFunc("def");
//cannot call directly (as they're private) (gives error)
calc.methods.abc();
答案 1 :(得分:0)
您可以使用 运算符:
if("func" in window) func();
你可以看看OOP,动态函数名称总是一个坏主意......