開眼! JavaScript――言語仕様から学ぶJavaScriptの本質を輪読会で読み進めている最中です。
本書の中で紹介されていたapply
やcall
やbind
について、Chromeのデベロッパーコンソールを利用して復習・確認した📝になります。
apply
もcall
もbind
も第一引数にオブジェクト
を指定することができます。
apply
とcall
は第二引数の形が異なり、bind
はオブジェクト
を指定するのみ(()で実行する)という浅い理解です。
今回確認したのは、オブジェクト
の部分となります。
apply
もcall
もbind
も実務で利用する経験がなく、あまり利用どころにピンと来ていないのが正直なところです。いずれも↑の輪読会をやっていく中でその存在を知りました。
事前準備
thisの違いを明確に分かりやすくするためにclassを実装する
ついでにインスタンス化した変数(zzz)を用意しておきます。
class ZZZ {
constructor(x,y) {
this.x = x;
this.y = y;
}
}
const zzz = new ZZZ(1,2);
// → ZZZ {x: 1, y: 2}x: 1y: 2__proto__: Object
thisを出力するだけの関数を用意する
ついでに呼び出してみます。
function KANSU(){
console.log(this)
}
KANSU();
// → Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}
thisを出力するだけの関数式を用意する
ついでに呼び出してみます。
const KANSUSIKI = function(){
console.log(this);
}
KANSUSIKI();
// → Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}
thisを出力するだけのアロー関数を用意する
ついでに呼び出してみます。
const ALLOW = () => {
console.log(this);
}
ALLOW();
// → Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}
違いを確認する
関数でapply
もcall
もbind
を確認してみる
引数として渡しているthis
を参照していることが分かります。
KANSU.apply(zzz);
// → ZZZ {x: 1, y: 2}
KANSU.call(zzz);
// → ZZZ {x: 1, y: 2}
KANSU.bind(zzz);
// ƒ KANSU(){
// console.log(this)
// }
KANSU.bind(zzz)();
// → ZZZ {x: 1, y: 2}
関数式でapply
もcall
もbind
を確認してみる
引数として渡しているthis
を参照していることが分かります。
KANSUSIKI.apply(zzz);
// → ZZZ {x: 1, y: 2}
KANSUSIKI.call(zzz);
// → ZZZ {x: 1, y: 2}
KANSUSIKI.bind(zzz);
// ƒ (){
// console.log(this)
// }
KANSUSIKI.bind(zzz)();
// → ZZZ {x: 1, y: 2}
アロー関数でapply
もcall
もbind
を確認してみる
出力ログからwindowオブジェクトを参照していることが分かるため、引数として渡しているthis
は利用されていないことが分かります。
ALLOW.apply(zzz)
// → Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}
ALLOW.call(zzz)
// → Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}
ALLOW.bind(zzz)
// () => {
// console.log(this);
// }
ALLOW.bind(zzz)()
// → Window {0: global, window: Window, self: Window, document: document, name: "", location: Location, …}