[英]javascript curry/partial function invokation for object functions
我想要一個像咖喱一樣的功能 - 這種事情
function invoker (fn) {
var slice = Array.prototype.slice,
args = slice.apply(arguments, [1]);
return function () {
return fn.apply(null, args);
};
}
但我希望用戶能夠做到
invoker(f)
要么
invoker(foo.bar)
我無法找到正確的魔法咒語來做到這一點。 我看到的所有示例都要求范圍對象單獨傳遞; 這容易出錯並且不自然。 IE
invokerx(foo.bar, foo)
無論如何還有嗎? 我不介意有兩個不同的功能
invokeG(f)
invokeO(foo.bar)
編輯:澄清
'f' is a global scope function
'foo' is an object
'bar is a method on that object
IE我希望這個咖喱工具使用“自由”功能以及對象功能。
不得不去
<curry function>(foo.bar,foo)
看起來有點笨重,我不得不兩次說'foo'
的第一個參數apply
是this
是提供給函數。 由於您傳遞null
, this
將映射到window
。
以下修改將起作用:
function invoker (fn, target) {
var slice = Array.prototype.slice,
args = slice.apply(arguments, [2]);
if(typeof fn === 'string')
fn = (target || window)[fn];
return function () {
return fn.apply(target || null, args);
};
}
// Either will work:
invoker(foo.bar, foo);
invoker('bar', foo);
// Any of these will work:
invoker(escape, null);
invoker(escape, window);
invoker('escape', null);
invoker('escape', window);
更新添加了一個小的更改以添加對名稱傳遞的支持,因此您不必兩次傳遞對象名稱。
更新2由於我們正在討論,我們需要始終有兩個論點。
你不能。 當你做invoker(foo.bar)
, invoker
無法知道參數是foo
的成員函數。 函數不存儲它們的“所有者”,並且invoker
只是傳遞對函數的引用。
你可以得到的最接近的是使用function.bind()
,如下所示:
invoker(foo.bar.bind(foo))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.