this は関数がどのように定義されたかではなく、関数がどのように呼び出されたかで決まります。ルールは 5 つあります。
js
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
this は関数がどのように定義されたかではなく、関数がどのように呼び出されたかで決まります。ルールは 5 つあります。
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
アロー関数は自身の this を持たず、定義された時点で囲んでいるスコープから this を継承します。だからこそアロー関数はコールバックに最適です。
const obj = {
items: [1, 2],
logAll() {
// ✅ arrow inherits `this` from logAll → `this` is obj
this.items.forEach(i => console.log(this.items, i));
// ❌ a regular function here would have its own `this` (undefined) → crash
// this.items.forEach(function (i) { console.log(this.items); });
},
};
メソッドをコールバックとして渡すと、その時点で単なる関数呼び出しになるため、バインディングが失われます。
button.addEventListener("click", obj.getX); // ❌ `this` is the button
button.addEventListener("click", () => obj.getX()); // ✅ keeps obj
button.addEventListener("click", obj.getX.bind(obj)); // ✅ also fine
this の誤解は最もよくある JS のバグの一つです。
解決策はたいてい、意図した this を固定するためにアロー関数を使うか .bind() を使うことです。