ナカザンドットネット

それって私の感想ですよね

JSはbindで関数の部分適用ができる

JS初心者の備忘録です。

お仕事でJS向けのAPIクライアントライブラリのラッパーを作り始めた関係で、Promiseと戦っています。

Promiseといえば、promise-bookですね。

azu.github.io

azuさんには足を向けて寝られません。

ところで、promise-bookには、次のようなサンプルがあります。

function sequenceTasks(tasks) {
    function recordValue(results, value) {
        results.push(value);
        return results;
    }
    var pushValue = recordValue.bind(null, []);
    return tasks.reduce(function (promise, task) {
        return promise.then(task).then(pushValue);
    }, Promise.resolve());
}

pushValueの生まれ方と使われ方が気になります。

  • 既存の知識
    • thenに入れられるということは、引数をひとつ取る関数であるはず
    • bindを関数Xに適用すると、第一引数に入れたthisが適用先の関数Xでthisとして扱われるようになる・・・という機能の他に、第二引数以降が関数Xの引数として適用される
  • recordValueは引数をふたつ取る関数なのに、bindでは[]のひとつしか渡していない

これらの条件から、pushValueは「recordValueの第一引数に[]を部分適用した関数」なのかなと想像しました。

と、ここまで何も資料を見ずに考察していたのですが、普通にドキュメント見たらいいですよね。

developer.mozilla.org

Partial Functionsの項に、引数の束縛についても書いてありますね。最初からこっち見ておけばよかった。

サンプル

公式ドキュメントを見る前に、bindが想像した通りの動作をするかどうか確認したサンプルです。

var add = function(a, b) {
  return a + b;
}

add(1, 2); // => 3

var addOne = add.bind(null, 1); // 第一引数を1に束縛

addOne(2); // => 3
addOne(0); // => 1

うん、部分適用されていますね。

まとめ

JSではbindを使うと関数の部分適用ができる。なかざんおぼえた。

まだまだJS初心者なので、今後もこういう発見がたくさんありそうで楽しみです。