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はインスタンスを参照 } }
ベストプラクティス
[編集]関連概念
[編集]- クロージャ
- スコープ
- コンテキスト
- アロー関数