call, apply, bind

by tea4two

JavaScript

var obj = {
	num: 2,
};

var obj2 = {
	num: 5
}

var addToThis = function(a, b, c) {
  console.log('thisの正体: ', this);
	return this.num + a + b + c;
};
// エラーを起こすパターン numはaddToThis自体には無い
console.log(addToThis(2));

// 関数にオブジェクトを読み込み実行???
// 関数A.call(オブジェクト名, 関数Aに渡すパラメータ値)
console.log('call test: ', addToThis.call(obj, 2, 4, 6));



// 関数A.apply(オブジェクト名, 配列)
// 配列の数は関数Aのパラメータ数に合わせておく!!
console.log('apply test: ', addToThis.apply(obj2, [2,4,6]));


// 関数A.bind(オブジェクト名)
// 返り値がオブジェクトを乗っけた後の関数A自身が返る
// 実行はされない。
// bindする際にパラメータを渡すことも可能(無くてもOK)
// var bound = addToThis.bind(obj2, [2,3,4]);
var bound = addToThis.bind(obj2);
console.dir(bound(1,2,3));


/* 
まとめ
call, apply, bindを実行した際に重要なことは
関数は乗っけたオブジェクトに紐づくこと。以下のような状態になる
var obj = {
	obj: 3,
  関数A: function() {
  	...
  }
}
なので this の内容はそのオブジェクトになるということ。

*/