bind

GM_xmlhttpRequest を使ってるソースでちょくちょく見かける ( 以下のようなコード ) んだけどそのわりに何やってるかわからんので手を出してみた。

Function.prototype.bind = function(object) {
    var __method = this;
    return function() {
        return __method.apply(object, arguments);
    }
};

GM_xmlhttpRequest({
    method: 'GET',
    url:    'http://example.com',
    onload: this.responseProcessor.bind(this),
});

調べてみた限りでは prototype.js が元ネタだと思うんだけど apply がわかればなんてこたない ( http://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/Function/Apply ) 。要は bind 「結びつく」わけだ。誰が何にってのが重要だけど「 bind の呼び出し元の ( 左のドットのさらにひだりにある ) 関数」が「引数にある object 」に結びつく。

まぁ bind には「束縛する」っていう意味もあるんだけどっていうか普通そっちの意味なんだけど関数がオブジェクトを束縛する っていうと「なんでお前上から目線なわけ ? 」とかオブジェクトが関数に対して言い放ちそうなので というよりは関数がどこかに身売りされそうになってるところで元の家にしがみつくみたいなかわいそうなイメージがつきまとうので という表現では所属していたオブジェクトから切り離されそうになっているところを bind 関数でつなぎとめてやるっていうニュアンスにならないと思うんだよね。いやまぁ「オブジェクトが関数を束縛している」でもいいけど英語的な並びで記述できないしょ、それ。 bound にすると途端に M のかほりがするし。

あーあと上のコードはよく見る形なんだけど prototype.js そのままじゃないんだよね。たぶん $A 関数も一緒に持ってこないと動かないので上のように変更してある、というのともともとの bind は関数とオブジェクトを結びつけると同時に関数駆動時の引数も渡すことができるみたいなんだけど、それやるとたぶん混乱の元になるというかよほどわかってないといけないとか、単純にそこまでのものがいらないとかで上記実装みたいになってるんじゃないかと思う。おれもうえので問題ないと思うし。

改めて読み返すといろいろひどい文章だなこれ。