2013-01-15 26 views
1

柯里功能,可有用:具有固定参数的自定义为了柯里JavaScript函数

function tag(name, value) { 
    return '<' + name + '>' + value + '</' + name + '>'; 
} 

var strong = tag.bind(undefined, "strong"); 
strong("text"); // <strong>text</strong> 

现在想象一下,我们必须使用另一个函数的参数

function otherTag(value, name) { 
    return '<' + name + '>' + value + '</' + name + '>'; 
} 

如何使用绑定功能顺序错误获得相同的结果 - 使用otherTag函数创建强标签。

如何使用绑定


我不是基于包装otherTag功能类似这样的兴趣的解决方案:

wrapOtherTag(name, value) { 
    return otherTag(value, name); 
} 

我想知道如果有可能传递参数绑定到告知的参数的顺序我们想要咖喱。

+0

都能跟得上。参数按照您传递的顺序进行绑定。你必须实现你自己的解决方案。 –

+2

@opengrid。如果您详细描述可能有用的情况,您可能会获得更多兴趣。 –

+2

@opengrid。附:你确定'currying'是你问的问题的正确名词吗? –

回答

1

您可以编写自己的函数来完成此操作。

// Uncurry `this` in `slice`. 
var slice = Function.prototype.call.bind(Array.prototype.slice); 

function curry(fn, arg, index) { 
    return function curried(/* ...args */) { 
     var args = slice(arguments); 
     args.splice(index, 0, arg); 
     return fn.apply(this, args); 
    }; 
} 

var strong = curry(tag, "strong", 0); 
strong("text"); // <strong>text</strong> 

var otherStrong = curry(otherTag, "strong", 1); 
otherStrong("text"); // <strong>text</strong> 
2

编写一个函数来扭转参数顺序:

function swap(fn) { 
    return function(a, b) { 
     return fn(b, a); 
    }; 
} 

现在只需拨打

swap(otherTag).bind(0, "strong"); 
+0

简单而优雅! – Hrishi