Javascript如果功能检查

时间:2017-07-17 14:41:55

标签: javascript jquery function

我搜索过并发现了很多关于此问题的讨论,但似乎没有任何解决方案可行。

方案:  我有一个处理复杂计算器的中央脚本。这个计算器有超过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");} 

但是当我将它包装在更广泛的用户和更少代码的函数中时。我只是知道我做了一些愚蠢的事情,但是我已经杀了几个小时了,因此有时间点火!任何朝着正确方向踢的人都会赞赏。

2 个答案:

答案 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,动态函数名称总是一个坏主意......