javascript - 使用 call 或 apply 调用闭包中的函数?

标签 javascript

假设我有一个松散的增强闭包,其中包含一些我想要访问的功能[大大简化]

var Process = (function(Process,$){
    _thing1 = function(a,b,c) {
         return a + b + c;
    }
    _thing2 = function(a,b,c) {
         return $(a).html(b + c);
    }
    return {
       Fred: {
          Add: _thing1
       },
       Bob: {
          Add: _thing2
       }
     }
}(Process || {},jQuery));

我可以直接调用该函数

var foo = Process.Fred.Add(1,2,3);

如果我在要调用的函数名称和一些参数的对象中有一个字符串表示形式,我该如何调用它?

var data = {
    "function": "Process.Fred.Add",
    "params": [1,2,3]
}

我无法使用data.function.apply(data.function.params),因为它会导致类型错误。

最佳答案

如果 Process 位于全局范围内,您可以遍历树来获取对该方法的引用,以便执行它。

var Process = (function(Process, $) {
  _thing1 = function(a, b, c) {
    return a + b + c;
  }
  _thing2 = function(a, b, c) {
    return $(a).html(b + c);
  }
  return {
    Fred: {
      Add: _thing1
    },
    Bob: {
      Add: _thing2
    }
  }
}(Process || {}, jQuery));

var data = {
  "function": "Process.Fred.Add",
  "params": [1, 2, 3]
}

var result = data.function.split(/\./g)         //break up string into pieces
               .reduce((o, k) => o[k], window)  //walk the tree to get method reference
                 .apply(this, data.params);     //execute the method with the parameters
console.log(result)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

如果它不在全局范围内,那么您需要将Process放在您可以引用的地方。

EG:一个对象

var myStuff = { "Process: : {} }

比减少线会是

...reduce((o, k) => o[k], myStuff)

关于javascript - 使用 call 或 apply 调用闭包中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44825317/

相关文章:

javascript - 如果一个类的所有实例

javascript - 将数组传递给 app.get() 的第一个参数的替代方法是什么?

VS2008中的JavaScript调试

javascript - 在 Angularjs 中的另一个指令模板中使用一个指令

javascript - Firefox:获取视口(viewport)左上角的鼠标坐标

javascript - 如何在 jquery ui datepicker 中突出显示特定日期

javascript - 使用 fs 模块了解 Node JS 生成器

javascript - single & 和 single | 是什么意思运营商在flow js中做什么?

javascript - `setTimeout` 将 `this` 绑定(bind)到什么?

javascript - 从 node.js 运行 Python 脚本时出现 parseError