2014-04-12 57 views
0

我需要定義一個回調,該回調將由外部庫調用。此回調調用與1個參數:是否可以在不改變行爲的情況下重新定義javascript函數的某些部分?

function(item) {}; 

在我的情況我需要包括我目前使用「綁定」的方法解決的第二參數。

function(item) { 
    var value = this.value 
}.bind({'value': value}); 

我不想要這個,我需要定義shuch一個回調函數,每次都寫。相反,我想編寫這樣的事:

function(item, value) {}; 

,然後會按順序轉換成綁定方法,以滿足外部庫。

這可能嗎?或者有其他方法可以做到這一點嗎?

感謝

+0

使用您引用作爲回調 – adeneo

+0

怎麼叫這個回調命名函數?什麼叫它? – Joseph

+0

@adeneo:我不明白這會有什麼幫助!你能舉一個例子嗎? –

回答

0

可以使用function.partial實現從here

Function.prototype.partial = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments); 
    return function(){ 
     var arg = 0; 
     for (var i = 0; i < args.length && arg < arguments.length; i++) 
     if (args[i] === undefined) 
      args[i] = arguments[arg++]; 
     return fn.apply(this, args); 
    }; 
    }; 

這樣定義回調:

callback = function(item, value) { console.log(item + value) }.partial(undefined, "myValue") 

現在當你調用callback('myItem'),它正確地顯示「 myItem myValue「

+0

如果其中一個預初始化參數的值爲* undefined *,那麼* partial *的版本可能會失敗。從[* Oliver Steele的functional.js *](http://osteele.com/sources/javascript/functional/)獲得原作更好。 – RobG

1

You wa nt使用閉包。這是基本模式,儘管不像Georg所建議的那麼容易。但是在性能方面,幾乎沒有這麼高(接近最小)。

定義一個函數:

myValueFunction(value, fn){ 
    return fn; 
} 

因爲它似乎你說你的插件提供item和您提供的value,您將設置myValueFunction(yourvalue, function(item){})爲你的插件回調函數(與你的實際值作爲參數)。它將「返回」另一個函數,其中包含一個帶有一個參數(item)的值。

因此,舉例來說,如果你有一個插件:

var myValue= "x"; 
plugin.doSomething("Plugin Argument", myValueFunction(myValue, function(item){ 
    console.log(item, value); 
})); 

這基本上就是喬治的回答是幹(他是在一個較爲通用的方式),但他的方法會更慢的性能代價比如果你直接定義這些函數,特別是如果你開始添加許多參數。

+0

讓我知道你是否需要進一步澄清。這是一個非常靈活的模式,可用於這種情況! –

+0

謝謝你的回答。這解決了我的問題,在這個具體的例子中,但我喜歡來自@georg的通用行爲答案。 –

+0

是的,看過它之後,georg的答案有點多才多藝! –

相關問題