Function#bind
prototype.jsをインポートすると追加される「Function#bind」を使うと、「関数とオブジェクトを関連づけた関数」を作成できます。
- オブジェクトと関連づけられていない関数内では、thisはグローバルスコープとなりますが、
- オブジェクトと関連づけられた関数では、thisは関連づけられたオブジェクトになります。
- 「引数で指定したオブジェクトをレシーバーとして起動する関数にしたものを返します」、とかいった表現の方が適切かな?
サンプルは以下。
var out = document.getElementById( "out" ); // 内部でthisを使う関数。 // オブジェクトと関連づけずに実行するとグローバルスコープがthisになる。 var f = function( str ) { return this.x + ":" + str; } // prototype.jsをインポートすると追加されるFunction#bindを使うと // 関数と引数で指定したオブジェクトを関連づけた関数を作成できる。 var f2 = f.bind({"x":"a"}); // このとき、メソッド内のthisは「関連づけたオブジェクト」になる。 out.innerHTML += f2("foo") + "<br/>"; // a:foo f2 = f.bind({"x":"b"}); out.innerHTML += f2("var") + "<br/>"; // b:var