(JS)Function.prototype.bind

Function.prototype.bindを知りませんでした. Promise本で出てきて知りました.

orz

Promise本

http://azu.github.io/promises-book/

PromiseはJavaScriptの仕様として検討されている非同期プログラム処理を行ううんぬんかんぬんです.

非同期処理プログラミング

初めて聞くと「非同期」ってなんだよ,って思うだろうけど,僕もいまだに馴染めません.JavaScriptはいわゆるシングルスレッドで,マルチスレッドっぽくブラウザがイベントをくれるのでそれをさばくのが非同期処理のプログラム,,,と書いててやっぱり説明ができないのは「非同期」って日本語がよくないのだと思う.

Ajax からの・・・非同期,非同期,非同期

Ajaxという言葉が流行ったけど,Ajaxが「Asynchronous JavaScript And XML」というものの略語です.

AsynchronousがSynchroous(シンクロ)の否定形なわけですね.で,「Ajax」という用語がすでに死語,および,バズワードになってる.通信量が多い上に解析も面倒なXMLを使うこともないし. それで「非同期」という単語だけが生き残ってるのではと思います.

こういうのは概念として捉えればよいのだけれど,やはり名称を与えると人格のようなものをもって独り歩きします.(Ajaxの末路になる可能性大ですが;) 僕は「イベント監視プログラム」とか「タイミング同期プログラム」くらいに捉えてます.

Function.prototype.bind知らなかった

Function.prototype.bindですが,まじで知らなかった,恥ずかしい; 非同期プログラミング(「非同期」使ってしまった;)を今年になるまであんまり詳しく使ってなかったからしょうがないとしておきたい. 今,仕組みを知ってからは,「ああ,あの処理はコレを使ってるんだな」くらいは気づきました.

要はcallやapplyの仲間です,と認識しました. メソッド(関数)をとあるオブジェクトに適用(apply)する訳です.

ES5からなので,新しめ,ですか?

サンプルプログラム

Function.prototype.call, apply

/*
 * 使用したい関数
 */
var say = function(msg) {
  return console.log(this.name + " say '" + msg + "'");
};

/*
 * call
 */
say.call({
  name: "よつば"
}, "いいわけはじごくできく(call)");
// -> "よつば say 'いいわけはじごくできく(call)'"

/*
 * apply
 */
say.call({
  name: "よつば"
}, ["いいわけはじごくできく(apply)"]);
// -> "よつば say 'いいわけはじごくできく(apply)'"

  • call, applyともに第一引数は,関数を結び付けたいオブジェクト(実行コンテキスト)を設定する.関数の中でオブジェクトのプロパティをthis.プロパティのように「this」を使うのが大きなメリット.
  • callの第二以降の引数には,関数に渡すパラメータを直に渡す. applyの第二引数には,関数に渡すパラメータを含む配列をひとつ渡す.
  • 特にオブジェクトに結び付けなくて良い場合,第一引数はnullで構わない.


Function.prototype.bind

/*
 * bindしたい関数
 */
plusWithMsg = function(msg) {
  return console.log("Message: " + this.name + " " + msg + " " + this.a + " + " + this.b + " = " + (this.a + this.b));
};

calc1plus2 = plusWithMsg.bind({
  name: "よつば",
  a: 1,
  b: 2
}, "が計算します(bind)...");  // 関数とオブジェクトをbindする
calc1plus2();                // 実行
// -> "Message: よつば が計算します(bind)...: 1 + 2 = 3"

  • bindの第一引数は,call, applyと同様に,関数を結び付けたいオブジェクト(実行コンテキスト)を設定する.
  • bindの第二以降の引数には,callと同じく関数に渡すパラメータを直に渡す.
  • 特にオブジェクトに結び付けなくて良い場合,第一引数はnullで構わない.
  • 最大の違いはbindはオブジェクトに結び付けられた関数を返すということ. call, applyは即実行するが,bindで作成された値は関数なので関数を実行しなければならない. なんだか,とっても非同期に使いそうです!!!


というところでした.