2012-03-22 82 views
2

this question推薦模式超載,我們必須一個類似於:JavaScript和回調

function foo(a, b, opts) { 

} 

foo(1, 2, {"method":"add"}); 
foo(3, 4, {"test":"equals", "bar":"tree"}); 

怎麼會一個接着包括回調作爲最後一個參數?我有功能foo(),應該是能夠同時處理的:

foo(x, y, function() { 
    // do stuff 
}); 

而且

foo(x, y, z, function() { 
    // do stuff 
}); 

有什麼建議?

+0

也許我誤讀或誤解,但你要問,如果你可以在把一個函數一個東西? – Snuffleupagus 2012-03-22 21:47:30

+0

這也可以工作,但不能找到如果這是可能的 – 2012-03-23 17:01:56

+1

這確實是可能的。 '{ 「奧斯卡」:函數(){的console.log( 「我生活在一個垃圾桶」)}}'所以,假設你命名你的對象foo,foo.oscar將運行功能。 – Snuffleupagus 2012-03-26 13:19:18

回答

0

結束了以下解決方案去:

foo(args) {} 

foo({"x":"add", "callback": function() { 
    // do stuff 
}}); 


foo({"x":"equals", "y":"tree", "callback": function() { 
    // do stuff 
}}); 

,然後簡單地檢查,看看最後的參數值是一個函數,阿拉@PaulP。 RO的解決方案如上:

if((arguments.length > 1) && (typeof arguments[arguments.length - 1] === 'function')) { 
    var callback = arguments[arguments.length - 1]; 
} 
1

我想說的只是使用arguments對象:

function foo(a, b) { 
    // Do stuff 


    // Done stuff 


    var alength = arguments.length; 

    // If more than 2 arguments and last argument is a function 
    if(alength > 2 && typeof arguments[alength - 1] === 'function') 
     arguments[alength - 1].call(this); 
} 
+1

但你爲什麼使用window.arguments而不是本地參數變量? – Bergi 2012-03-22 21:58:08

+1

@Bergi我......我不知道爲什麼我那麼做。 – Paulpro 2012-03-22 22:05:36

1

所以基本上你要接受可變數量的參數,隨後回調作爲最後一個?類似於PHP的array_udiff的工作原理?

這是相當簡單:

function foo() { 
    var args = [], l = arguments.length, i; 
    for(i=0; i<l; i++) args[i] = arguments[i]; 

    var callback = args.pop(); 
    // now you have your variable number of arguments as an array `args` 
    // and your callback that was the last parameter. 
} 
+1

到底爲什麼你會用'for'循環創建參數數組的精確副本,然後在彈出的回調,而不是僅僅使用'arguments'? – joncys 2012-03-22 21:55:18

+1

因爲'arguments'是類似陣列的對象,而不是實際的陣列。 – 2012-03-22 22:01:24

+0

你可以只用'變參= Array.prototype.slice.call(參數)' – 2013-12-11 01:49:25

1

您可以做類似於.apply。 (不像.call

function foo(args, cb) {} 

foo(['a', 'b', 'c'], function() {}); 

如果你需要,你可以把它們放到變量使用.shift

function foo(args, cb) { 
    var a = args.shift(), 
     b = args.shift(); 
    // and so on... 
}