代码之家  ›  专栏  ›  技术社区  ›  Pete - iCalculator

Javascript if函数检查

  •  0
  • Pete - iCalculator  · 技术社区  · 9 年前

    脚本: 我有一个处理复杂计算器的中央脚本。这个计算器有1000多个独立的计算器,每个计算器都通过函数调用。

    因此,核心脚本类似于此:

    var m1 = 5;
    var m2 = 8;
    
    
    dynamicfunction1();
    dynamicfunction2();
    
    var m3 = m1 + m2;
    

    例如,动态函数可以改变m1的值,具体取决于标准(我保持简短的示例)。

    因此,我打算:

    FncChk("dynamicfunction1");
    FncChk("dynamicfunction2");
    

    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 回复  |  直到 9 年前
        1
  •  1
  •   fdomn-m    9 年前

    您可以使用 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();

    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();
        2
  •  1
  •   Jonas Wilms    9 年前

    你可以使用 在里面

    if("func" in window) func();