JavaScript/this
this キーワード
編集基本概念
編集this
は、JavaScriptにおいて現在の実行コンテキストを参照する特殊なキーワードです。その値は、関数の呼び出し方法によって動的に変化します。
コンテキストによる this の変化
編集グローバルコンテキスト
編集グローバルスコープでは、this
はグローバルオブジェクトを参照します:
// ブラウザ環境 console.log(this === window); // true // Node.js環境 console.log(this === global); // true
関数コンテキスト
編集通常関数では、this
の値は関数の呼び出し方に依存します:
// メソッド呼び出し const obj = { name: 'John', greet() { console.log(this.name); // 'John' } }; // 単純な関数呼び出し function standalone() { console.log(this); // グローバルオブジェクト(strictモードではundefined) }
バインディングの種類
編集暗黙的バインディング
編集オブジェクトのメソッドとして呼び出された場合:
const person = { name: 'Alice', sayHello() { console.log(`Hello, ${this.name}`); } }; person.sayHello(); // 'Hello, Alice'
明示的バインディング
編集call()
、apply()
、bind()
メソッドを使用:
function greet() { console.log(`Hello, ${this.name}`); } const user = { name: 'Bob' }; // call/applyでthisを明示的に設定 greet.call(user); // 'Hello, Bob' greet.apply(user); // 'Hello, Bob' // bindで永続的にthisをバインド const boundGreet = greet.bind(user); boundGreet(); // 'Hello, Bob'
コンストラクタバインディング
編集new
キーワードを使用すると、this
は新しく作成されたインスタンスを参照します:
function Person(name) { this.name = name; } const john = new Person('John'); console.log(john.name); // 'John'
アロー関数の特殊な動作
編集アロー関数は、this
を静的に(レキシカルに)バインドします:
const obj = { name: 'Context Test', regularFunc: function() { setTimeout(function() { console.log(this.name); // undefined }, 100); }, arrowFunc: function() { setTimeout(() => { console.log(this.name); // 'Context Test' }, 100); } };
注意点と落とし穴
編集クラスでの this
編集クラスメソッドでのthis
の動作:
class Counter { constructor() { this.count = 0; } increment() { this.count++; // thisはインスタンスを参照 } }
ベストプラクティス
編集関連概念
編集- クロージャ
- スコープ
- コンテキスト
- アロー関数