【问题标题】:How to execute a function which details are passed as parm in another function如何执行一个函数,该函数的详细信息在另一个函数中作为参数传递
【发布时间】:2015-07-02 21:14:34
【问题描述】:

我需要使用参数执行一个外部函数。外部函数可以不同,因此我通过调用主函数传递外部函数的详细信息。主函数将对象作为参数。所以我发送的信息是正确传输的。但是,当需要执行外部函数时,对象键正在尝试执行值,因此出现错误。我错过了什么?有没有更好的方法来解决这个问题?

HTML:

 <button onclick="fn.funcExt({name: 'foo', param: 'bar+baz'})">Check</button>

JS:

fn = (function(){

var publicAPI = {

    funcExt: function(o){return funcExt(o)}
};


////////////////////////////////////

function funcExt(o){
    console.log(o.name)
    console.log(o.param)
    o.name(o.param);
}



return publicAPI;
})();


/////////////////////////////////////////

function foo(s){
   alert('passed' + s);
}

小提琴:http://jsfiddle.net/rexonms/sf8f05fh/

【问题讨论】:

  • funcExt: function(o){return funcExt(o)}funcExt: funcExt 相比有什么意义?
  • 是的,它是一样的。这就是我喜欢组织代码的方式,因为原始对象要复杂得多。

标签: javascript oop object


【解决方案1】:

假设外部函数是全局的,您可以使用方括号表示法将其作为window 对象的属性访问,以便属性名称成为您提供的任何表达式的结果(在这种情况下, o.name 属性)

window[o.name](o.param);

如果它位于全局“命名空间”对象中,您也会这样做。

SomeNS[o.name](o.param);

【讨论】:

    【解决方案2】:

    不要将foo 放在引号中。

    <button onclick="fn.funcExt({name: foo, param: 'bar+baz'})">Check</button>
    

    这样,o.name 将是函数,而不是函数名。

    如果要记录函数的名称,可以这样做:

    console.log(o.name.name);
    

    DEMO

    【讨论】:

      【解决方案3】:

      如果你不想弄乱全局上下文,你可以考虑bind

      您可以将接受的答案解决方案修改为

      this[o.name](o.param);
      

      默认情况下它将是 window 对象,但如果您想成为其他对象,可以将您的 publicAPI 对象更改为更有意义的对象:

      var publicAPI = {
        funcExt: funcExt.bind(yourContext);
      }
      

      所以上面的this 将指向yourContext

      【讨论】:

      • 这太棒了。我一直在寻找这样的东西,我不会在全球范围内遇到困难。非常感谢!!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多