【问题标题】:How can I call any function in a chain of functions, without the chaining?如何在没有链接的情况下调用函数链中的任何函数?
【发布时间】:2011-06-06 17:50:27
【问题描述】:

对不起,如果我的问题不够清楚。我会把我的代码放在这里...

var chain = {
    'fn_1' : {
             //fn_1 code here
             chain.fn_2();},
    'fn_2' : {
             //fn_2 code here
             chain.fn_3();}

...and so on
}

假设我想调用chain.fn_1(),有没有一种方法可以在不调用chain.fn_2() 的情况下做到这一点?

我现在能想到的是一个标志,但对于每个函数来说,这可能是很多多余的标志。大家有什么想法吗?

【问题讨论】:

    标签: javascript function object literals chain


    【解决方案1】:

    如果一系列函数都调用了下一个函数,那么你是正确的,你需要有某种标志。很可能,最好的办法是修改您的函数,以便它们返回对对象的引用。然后你可以像这样链接:

    var chain = {
      'fn_1': function () {
        // do something here.
        return this;
      },
      'fn_2': function () {
        // do something here.
        return this;
      },
      'fn_3': function () {
        // do something here.
        return this;
      }
    };
    
    // call the full chain:
    chain.fn_1().fn_2().fn_3();
    
    // call only the middle.
    chain.fn_2();
    

    【讨论】:

      【解决方案2】:

      g.d.d.c 的答案是最好的,但如果由于某种原因无法修改对象,您可以这样做:

      var _oldFn2 = chain.fn_2
      chain.fn_2 = function() { return; };
      chain.fn_1();
      chain.fn_2 = _oldFn2;
      

      【讨论】:

        【解决方案3】:
        var chain = {
            fn : ['fn1', 'fn2', 'fn3'],
            call : function(name) {
               var i = 0, pos = -1, l = this.fn.length;
                for(i = 0; i < l; i += 1) {
                    if(this.fn[i] == name) {
                        pos = i;
                    }
                    if(pos !== -1) {
                        this[this.fn[i]]();             
                    }
                }
        
            },
            fn1 : function() {
                alert('fn1');
            },
            fn2 : function() {
                alert('fn2');
            },
        };
        chain.call('fn1'); //chain
        chain.fn1(); //single
        

        【讨论】:

        • 我没有要返回的对象,所以 g.d.d.c 的 sn 不适用。但是对于确实具有的功能,我一定会使用它!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        相关资源
        最近更新 更多