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 に答える