this の参照を理解して、JavaScript コードをもっと使いこなそう
JavaScriptにおけるコールバック内の this の参照方法
この問題を解決するには、以下の方法があります。
アロー関数を使用すると、this
は常にその関数を定義したオブジェクトを参照します。
const obj = {
name: "John",
sayHello: () => {
console.log(`Hello, my name is ${this.name}`);
},
};
obj.sayHello(); // "Hello, my name is John" と出力
bind()
メソッドを使用すると、コールバック関数を別のオブジェクトのコンテキストで実行できます。
const obj = {
name: "John",
};
function sayHello() {
console.log(`Hello, my name is ${this.name}`);
}
const boundFunction = sayHello.bind(obj);
boundFunction(); // "Hello, my name is John" と出力
call()
または apply()
メソッドを使用すると、コールバック関数を明示的に指定したコンテキストで実行できます。
const obj = {
name: "John",
};
function sayHello() {
console.log(`Hello, my name is ${this.name}`);
}
sayHello.call(obj); // "Hello, my name is John" と出力
sayHello.apply(obj); // "Hello, my name is John" と出力
変数に保存する
this
を変数に保存しておけば、コールバック関数内でその変数を使用できます。
const obj = {
name: "John",
};
function sayHello() {
const self = this;
console.log(`Hello, my name is ${self.name}`);
}
obj.sayHello(); // "Hello, my name is John" と出力
これらの方法のいずれを使用するかは、状況によって異なります。アロー関数は最も簡潔な方法ですが、すべてのブラウザでサポートされているわけではありません。bind()
メソッドは、アロー関数を使用できない場合に便利です。call()
または apply()
メソッドは、複数の引数を渡す必要がある場合に便利です。変数に保存する方法は、最も古い方法ですが、最もわかりやすい方法です。
JavaScriptのコールバック関数内で this
を正しく参照するには、いくつかの方法があります。どの方法を使用するかは、状況によって異なります。
// アロー関数を使用する
const obj = {
name: "John",
sayHello: () => {
console.log(`Hello, my name is ${this.name}`);
},
};
obj.sayHello(); // "Hello, my name is John" と出力
// `bind()` メソッドを使用する
const obj = {
name: "John",
};
function sayHello() {
console.log(`Hello, my name is ${this.name}`);
}
const boundFunction = sayHello.bind(obj);
boundFunction(); // "Hello, my name is John" と出力
// `call()` または `apply()` メソッドを使用する
const obj = {
name: "John",
};
function sayHello() {
console.log(`Hello, my name is ${this.name}`);
}
sayHello.call(obj); // "Hello, my name is John" と出力
sayHello.apply(obj); // "Hello, my name is John" と出力
// 変数に保存する
const obj = {
name: "John",
};
function sayHello() {
const self = this;
console.log(`Hello, my name is ${self.name}`);
}
obj.sayHello(); // "Hello, my name is John" と出力
これらのサンプルコードを実行して、this
の参照方法を理解してください。
Function.prototype.bind.call()
メソッドは、bind()
メソッドと似ていますが、複数の引数を渡すことができます。
const obj = {
name: "John",
};
function sayHello(arg1, arg2) {
console.log(`Hello, my name is ${this.name}. ${arg1} ${arg2}`);
}
const boundFunction = Function.prototype.bind.call(sayHello, obj, "Hello", "world");
boundFunction(); // "Hello, my name is John. Hello world" と出力
new
演算子を使用すると、関数をコンストラクタとして呼び出すことができます。この場合、this
は新しいオブジェクトを参照します。
function Person(name) {
this.name = name;
}
const person = new Person("John");
console.log(person.name); // "John" と出力
this
キーワードを直接使用すると、現在のコンテキストのオブジェクトを参照できます。
const obj = {
name: "John",
sayHello() {
console.log(`Hello, my name is ${this.name}`);
},
};
obj.sayHello(); // "Hello, my name is John" と出力
これらの方法は、特殊な状況で使用されます。ほとんどの場合、上記の4つの方法で十分です。
javascript callback this