2011-06-06 59 views
0

對不起,如果我的問題不夠清楚。我把我的代碼在這裏...如何在一系列函數中調用任何函數,而無需鏈接?

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()?

我現在能想到的是一個標誌,但是對於每個功能來說,這可能會帶來很多額外的標誌。你們有什麼想法嗎?

回答

0
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 
+0

我不沒有對象返回,所以gddc的sn不適用。但對於那些確實會使用它的函數! – hamahama 2011-06-19 01:55:45

5

如果一系列函數每個調用下一​​個函數都是正確的,則需要有某種標誌。很可能,最好的做法是修改你的函數,以便它們返回對象的引用。然後,你可以鏈,像這樣:

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(); 
1

GDDC的回答是最好的,但如果你不能修改對象出於某種原因,你可以這樣做:

var _oldFn2 = chain.fn_2 
chain.fn_2 = function() { return; }; 
chain.fn_1(); 
chain.fn_2 = _oldFn2; 
相關問題