Function.prototype.bind

ECMAScript 5thでFunctionオブジェクトにbindというメソッドが追加されたそうだ。これは引数やスコープを束縛できるものらしい。引数を束縛して部分適用したり、クロージャに取り込まれた値を変えることが可能になる。

最新版のChromeでは実装されている。Firefoxは4で実装されるようだ。

引数をbind

function sum() {
  var sum = 0;
  Array.prototype.forEach.call(arguments, function(e,i){ sum += e });
  return sum;
}

sumPlus1 = sum.bind(null, 1);

sumPlus1(3,4)
 => 8

スコープをbind

var x = 5;
function m5(y) {
  return this.x * y
}

m5(10)
  => 50

m5はグローバルスコープで実行されるので、thisはwindowとなる。this.xは先に定義したvar x = 5が適用される。

bindを使うと、スコープを変更した関数を作成できる。

var m6 = m5.bind({x: 6});
m6(10)
 => 60

結果だけ見ると、これと同じっぽい

m5.call({x:6}, 10);

どういう場面で使うんだろう?

ついき

jQuery の作者 John Resig が書いた Learning Advanced JavaScript の Goal として設定されている bind メソッドがまさしくコレですね…。