1

柯里化函数可能很有用:

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 + '>';
}

如何使用 bind 函数获得相同的结果 - 使用 otherTag 函数创建强标签。

如何仅使用绑定来咖喱此功能?


我对基于像这样包装 otherTag 函数的解决方案不感兴趣:

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

我想知道是否可以将参数传递给 bind 来告诉我们想要咖喱的参数的顺序。

4

2 回答 2

2

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

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

现在只需打电话

swap(otherTag).bind(0, "strong");
于 2014-05-25T17:37:40.737 回答
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>
于 2013-01-17T16:06:03.413 回答