[過去ログ] + JavaScript の質問用スレッド vol.117 + (1001レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
308(4): デフォルトの名無しさん [sage] 2014/12/02(火) 13:27:53.03 ID:OQmm7jB2(1/3) AAS
jQueryにはbindに相当するものとして、$.proxyっていうのが有るのだけれど、
なんでbindがproxyという名前なのか昔から疑問だった。
prototypejsではbindという名前なのに。
最近その謎が解けた。それは変数にthisを代入すればいいから
bindは不要であるという話にもつながっていて、
例えば、>>293293(12): デフォルトの名無しさん [sage] 2014/12/02(火) 03:15:02.67 ID:MjRXeq65(1/3) AAS
外部リンク:developer.mozilla.org
初心者の JavaScript プログラマーがよくやる間違いは、
あるオブジェクトからメソッドを取り出し、後でその関数を呼び出すとき、
その内側の this 値が元のオブジェクトになると考えてしまうことです
(例えば、そのメソッドをコールバック関数に使うケース)。
特に配慮しなければ、元のオブジェクトは失われてしまいます
【訳注: 取り出した関数内の this としては使えなくなる】。
その関数に元々のオブジェクトを bind() して束縛された関数を生成すれば、
この問題をきちんと解決することができます:
var x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};
module.getX(); // 81
var getX = module.getX;
getX(); // 9, この場合 "this" はグローバルオブジェクトを参照するため
// 'this' を module に結びつけた新しい関数を生成
var boundGetX = getX.bind(module);
boundGetX(); // 81
みたいなものは、bindで渡すべきじゃない。
なぜなら、getXは普通に考えると自分自身のxを返すという仕様であり、
外部から指定されるべきものじゃないから。
そして外部から指定するもの。例えばあるクラスにイベントハンドラを
設定するみたいなコード。そのイベントハンドラに匿名関数を渡すのではなく、
別のオブジェクトの関数を渡す時に、$.proxyを使ってオブジェクトをバインドする。
(普通は関数だけじゃなくてオブジェクトも指定する必要があるから)
バインドしたい時というのは、このように別のオブジェクトの関数への
プロキシとして使うことがほとんどだから$.proxyという名前なんだ。
309: デフォルトの名無しさん [sage] 2014/12/02(火) 13:34:01.31 ID:OQmm7jB2(2/3) AAS
少し言い換えると、
「bindがthisを結びつけた新しい関数を生成」までが仕事の範囲なのに対して
「proxyはthisを結びつけた関数に処理を移譲」までが仕事の範囲というニュアンス
315: デフォルトの名無しさん [sage] 2014/12/02(火) 19:46:36.36 ID:OQmm7jB2(3/3) AAS
そういや、昔のブラウザ(IE5あたり?)はcallもapplyもなかったんだよな。
その時代にクロスブラウザやってたから、callとapply相当を
独自実装したことがあるよ。
どうやって実装したか、考えてみると面白いかもしれないね。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.064s