(標準組み込みオブジェクト > Function > メソッド)
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
// すでにある他の関数.bind(パラメータthis, 引数1, 引数2, ... ,引数N)
func.bind(thisArg, arg1, arg2, ... ,argN)
bindメソッドは、定義された関数に対して、thisを代入できるメソッドである。また、その名の通り関数などをbind(紐づけ)することができる。
(=すでにある他の関数を拘束して、他のオブジェクトのパラメータ(this)や引数と結びつけ、新しい関数を生成する)
// 飛行機オブジェクト
var airplane = {
name: '飛行機',
fly: function(){ // bind()の対象となる関数メソッド
console.log(this.name + 'が空を飛びます!');
}
};
airplane.fly(); // '飛行機が空を飛びます!
// carオブジェクト
var car = {
name: '車',
};
// bind() の場合(第1引数に carオブジェクト を指定)
var flyCar = airplane.fly.bind(car); // this.name は carオブジェクトの name'車' を参照
flyCar(); // 車が空を飛びます!
// call() の場合(比較用)
airplane.fly.call(car); // 車が空を飛びます!
動きが似ているcall()の場合と比較してみると
- call()は呼び出した関数をthisの参照先を変更してそのまま実行できる
(ここでは airplane.fly をそのまま実行) - bind()は関数の実行ではなく…
戻り値として新しい関数を生成し返すため、無名関数を宣言するように変数 = 対象の関数.bind()で生成した関数を変数に格納してから実行する
といった違いがある。
第2引数以降を指定した場合
// 飛行機オブジェクト
var airplane = {
name: '飛行機',
fly: function(destination, speed){ // bind()の対象となる関数メソッド
console.log(this.name + 'は' + destination + 'へ向かい' + speed + '飛び立ちました!');
}
};
// 車オブジェクト
var car = {
name: '車',
};
// bind() の場合
var flyCar = airplane.fly.bind(car, '2015年10月21日', '慌ただしく');
flyCar(); // 車は2015年10月21日へ向かい慌ただしく飛び立ちました!
// call() の場合(比較用)
airplane.fly.call(car, '2015年10月21日', '慌ただしく');
// 車は2015年10月21日へ向かい慌ただしく飛び立ちました!