JS初心者の備忘録です。
お仕事でJS向けのAPIクライアントライブラリのラッパーを作り始めた関係で、Promiseと戦っています。
Promiseといえば、promise-bookですね。
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の第一引数に[]
を部分適用した関数」なのかなと想像しました。
と、ここまで何も資料を見ずに考察していたのですが、普通にドキュメント見たらいいですよね。
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初心者なので、今後もこういう発見がたくさんありそうで楽しみです。