ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript の &#this&# キーワード: 初心者ガイド

JavaScript の &#this&# キーワード: 初心者ガイド

Barbara Streisand
リリース: 2024-11-29 13:22:10
オリジナル
432 人が閲覧しました

このブログでは、JavaScript の「this」キーワードについて詳しく説明し、JavaScript がどのように機能するか、さまざまなコンテキストで異なる動作をする理由、およびこれを習得することでコードがどのようにクリーンで効率的になるかを探っていきます。最後には、プロジェクトで JavaScript の「this」キーワードを効果的に使用する方法をしっかりと理解できるようになります。

The

では、JavaScript の「this」キーワードとは何でしょうか?

JavaScript の「this」キーワードは、コード内で動的なコンテキストベースの対話を可能にするため、不可欠です。これが非常に価値がある理由をいくつか挙げます:

  • オブジェクトのプロパティに直接アクセス: 「これ」を使用すると、関数内からオブジェクトのプロパティとメソッドにアクセスして操作できるため、オブジェクトを直接操作することが容易になります。
  • イベント処理: イベント駆動型 JavaScript では、「this」は多くの場合、イベントをトリガーした HTML 要素を指します。これにより、要素を関数に明示的に渡すことなく、DOM インタラクションの管理が容易になります。
  • 動的バインディング: 「this」は、関数の定義場所ではなく、関数の呼び出し方法に基づいて適応します。この柔軟性により、「this」は、グローバル関数、オブジェクト内のメソッド、イベント リスナーのコールバックなど、コンテキストに応じて異なるオブジェクトを参照できます。
  • オブジェクト指向パターンの簡素化: 「this」を使用すると、よりオブジェクト指向のアプローチが可能になり、プロパティとメソッドがオブジェクト内にカプセル化され、コードが整理され、スケーラブルになります。
  • コンテキスト実行: 「これ」により、関数を呼び出すオブジェクトのコンテキスト内で関数を実行できます。これは、オブジェクトを引数として渡す必要がないことを意味します。 「これ」は自動的にそれを参照します。
  • コンストラクターとクラスで役立ちます: ES6 クラスまたは従来のコンストラクター関数では、新しく作成されたインスタンスでプロパティとメソッドを定義し、各インスタンスに固有のデータを与えるために「this」が不可欠です。

これらの機能により、「this」はキーワードであるだけでなく、関数、オブジェクト、コンテキスト駆動コーディングに対する JavaScript のアプローチの基本的な側面でもあります。

さまざまなコンテキストにおける JavaScript の「this」キーワードを理解する

JavaScript では、「this」キーワードの値は固定されておらず、関数が呼び出されるコンテキストに応じて変化する可能性があります。 「this」のこの動的な性質は、JavaScript の最もユニークで、時には混乱を招く側面の 1 つです。大まかに言うと、「this」の値を決定するコンテキストがいくつかあります。

例を使用して各コンテキストを分析して、「this」がどのように動作するかを見てみましょう:

1. デフォルト/グローバルコンテキスト

「this」がグローバル コンテキストまたはスタンドアロン関数内で使用される場合、グローバル オブジェクト (ブラウザーではウィンドウ、Node.js ではグローバル) を指します。

例:

function showGlobalContext() {
  console.log(this);
}

showGlobalContext();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このコードは、ブラウザーでは Window { ... } を、Node.js では [グローバル オブジェクト] を出力します。 showGlobalContext はグローバル コンテキストで呼び出されるため、「this」はグローバル オブジェクト (ブラウザーのウィンドウまたは Node.js のグローバル) を指します。ここでは、明示的または暗黙的なバインディングがないため、「this」はデフォルトでグローバル スコープになります。

2. 暗黙的なバインディング

関数がオブジェクトのメソッドとして呼び出される場合、「this」はメソッドを呼び出したオブジェクトを指します。これは暗黙的バインディングとして知られています。

例:

const person = {
  name: "Alice",
  greet() {
    console.log(`Hello, I am ${this.name}`);
  }
};

person.greet();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これは、greet が person オブジェクトによって呼び出されるため、「こんにちは、私はアリスです」と出力します。暗黙的なバインディングにより、greet 内の「this」は人を指し、その name プロパティへのアクセスが許可されます。関数が先行するオブジェクトで呼び出されるときに、暗黙的なバインディングが発生します。

3. 明示的なバインディング

JavaScript では、call、apply、bind メソッドを使用して「this」を明示的にバインドできます。これらのメソッドを使用すると、「this」を特定のオブジェクトに直接設定できます。

例:

function introduce() {
  console.log(`Hello, I am ${this.name}`);
}

const user = { name: "Bob" };

// Using call
introduce.call(user);

// Using apply
introduce.apply(user);

// Using bind
const boundIntroduce = introduce.bind(user);
boundIntroduce();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

各メソッド呼び出しの出力 こんにちは、私はボブです。 call and apply を使用すると、すぐに導入を呼び出し、明示的に「this」をユーザーに設定します。このユーザーの name プロパティは「Bob」です。ただし、bind メソッドは、「this」がユーザーに永続的にバインドされた新しい関数を返すため、「this」が user に設定されたままで、後からバウンド紹介を呼び出すことができます。

4. アロー関数

JavaScript のアロー関数には、独自の「this」バインディングがありません。代わりに、それらはその語彙範囲、またはそれらが定義されたコンテキストから「this」を継承します。この動作は、コールバックと入れ子関数に役立ちます。

例:

const team = {
  name: "Development Team",
  members: ["Alice", "Bob", "Charlie"],
  introduceTeam() {
    this.members.forEach(member => {
      console.log(`${member} is part of ${this.name}`);
    });
  }
};

team.introduceTeam();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これは次のように出力します:

Alice is part of Development Team
Bob is part of Development Team
Charlie is part of Development Team
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここで、forEach 内のアロー関数は独自の「this」を作成しません。代わりに、チームによって呼び出される includeTeam から "this" を継承します。したがって、アロー関数内の「this」はチームを指し、name プロパティへのアクセスが可能になります。通常の関数が forEach で使用された場合、「this」は未定義 (厳密モード) になるか、グローバル オブジェクトを指すことになり、予期しない結果が発生します。

5. 新しいバインディング (コンストラクター関数)

関数がコンストラクターとして使用される場合 (new キーワードで呼び出される)、その関数内の "this" は新しく作成されたインスタンスを参照します。これは、独自のプロパティとメソッドを持つオブジェクトの複数のインスタンスを作成する場合に便利です。

例:

function showGlobalContext() {
  console.log(this);
}

showGlobalContext();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この例では、new Person("Alice") を呼び出すと新しいオブジェクトが作成されます。ここで、「this」はグローバルやその他のコンテキストではなく、その新しいオブジェクトを指します。結果は、name プロパティが「Alice」に設定された新しいインスタンス (person1) です。

6. クラスコンテキスト

ES6 構文では、JavaScript クラスもメソッド内のクラスのインスタンスを参照するために「this」キーワードを使用します。クラスの各インスタンスには独自の「this」コンテキストがあるため、動作は新しいバインディングに似ています。

例:

const person = {
  name: "Alice",
  greet() {
    console.log(`Hello, I am ${this.name}`);
  }
};

person.greet();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここで、showModel 内の「this」は特定のインスタンス myCar を参照し、そのモデル プロパティへのアクセスを許可します。新しい Carwill で作成された各インスタンスには、そのインスタンスを参照する独自の「this」があります。

7. DOM イベントリスナー

イベント リスナーでは、「this」はイベントをトリガーした HTML 要素を指します。これにより、引数として明示的に渡すことなく、その要素のプロパティまたはメソッドに簡単にアクセスできるようになります。

例:

function introduce() {
  console.log(`Hello, I am ${this.name}`);
}

const user = { name: "Bob" };

// Using call
introduce.call(user);

// Using apply
introduce.apply(user);

// Using bind
const boundIntroduce = introduce.bind(user);
boundIntroduce();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この場合、イベント リスナー内の「this」はクリックされたボタン要素を指し、そのプロパティとメソッドへのアクセスが可能になります。ただし、アロー関数をイベント ハンドラーとして使用する場合、「this」は字句スコープを参照することになり、予期しない動作が発生する可能性があります。

JavaScript の「this」キーワードに関する一般的な落とし穴

「これ」に関する誤解は、JavaScript で予期しない結果を引き起こす可能性があります。注意すべき一般的な落とし穴をいくつか示します:

1. コールバック関数で「this」が失われる

コールバックとしてメソッドを渡すと、「this」は元の参照を失う可能性があります。これは、関数がスタンドアロンとして (オブジェクトが呼び出さずに) 呼び出された場合、「this」がデフォルトでグローバル オブジェクトになるか、厳密モードで未定義になるために発生します。

例:

const team = {
  name: "Development Team",
  members: ["Alice", "Bob", "Charlie"],
  introduceTeam() {
    this.members.forEach(member => {
      console.log(`${member} is part of ${this.name}`);
    });
  }
};

team.introduceTeam();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この例では、setTimeout がユーザーのメソッドとしてではなくスタンドアロン関数としてgreetを呼び出すため、これはgreet内で未定義になります。

2. アロー関数の予期しない「これ」

アロー関数には独自の「this」コンテキストがありません。代わりに、周囲の語彙範囲から「this」を継承します。これにより、メソッドやイベント リスナーなど、「this」が呼び出し側オブジェクトを参照する必要がある状況でアロー関数を使用すると、問題が発生する可能性があります。この動作により、開発者が新しい "this" コンテキストを期待するシナリオで、"this" に予期しない値が発生する可能性があります。

例:

Alice is part of Development Team
Bob is part of Development Team
Charlie is part of Development Team
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここで、「this」はボタンではなくグローバル オブジェクトを指します。これは、アロー関数がイベント コンテキストではなく、その定義スコープから「this」を継承するためです。

3. 入れ子関数の「this」

メソッド内でネストされた通常の関数を使用する場合、「this」が外部の関数やオブジェクトではなく、予期せずグローバル オブジェクトを指す場合があります。これは、各関数呼び出しに独自の「this」コンテキストがあるために発生します。入れ子関数では、「this」が明示的にバインドされていない場合、デフォルトでグローバル コンテキストに戻り、外部オブジェクトのプロパティにアクセスしようとすると予期しない動作が発生する可能性があります。

例:

function showGlobalContext() {
  console.log(this);
}

showGlobalContext();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この例では、showName 内の「this」は、人を参照するのではなく、デフォルトでグローバル スコープに設定されており、予期しない出力が発生します。

JavaScript で「this」キーワードを使用するためのベスト プラクティス

JavaScript の「this」キーワードをマスターすると、コードの可読性と保守性が大幅に向上します。ここでは、「this」がさまざまなコンテキストで期待どおりに動作するようにするためのベスト プラクティスをいくつか示します。

1. 字句のスコープ設定にアロー関数を使用する

周囲のスコープから「this」を保持する必要がある関数には、アロー関数を使用します。アロー関数には独自の「this」がないため、定義された場所からそれを継承します。これは、コールバックまたは入れ子関数で役立ちます。

例:

const person = {
  name: "Alice",
  greet() {
    console.log(`Hello, I am ${this.name}`);
  }
};

person.greet();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

2. バインド、呼び出し、または明示的バインディングの適用を使用する

「this」を特定のオブジェクトに設定する必要がある場合は、bind、call、または apply を使用します。これは、「this」が特定のオブジェクトを参照する必要があるコールバックまたはスタンドアロン関数呼び出しに便利です。

例:

function introduce() {
  console.log(`Hello, I am ${this.name}`);
}

const user = { name: "Bob" };

// Using call
introduce.call(user);

// Using apply
introduce.apply(user);

// Using bind
const boundIntroduce = introduce.bind(user);
boundIntroduce();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

3. グローバルスコープでは「これ」を避ける

グローバル スコープでは、「this」はウィンドウ (ブラウザーの場合) またはグローバル (Node.js の場合) オブジェクトを指します。これにより、予期しない結果が生じる可能性があります。 「this」に依存する関数はオブジェクトまたはクラス内に保持してください。

例:

const team = {
  name: "Development Team",
  members: ["Alice", "Bob", "Charlie"],
  introduceTeam() {
    this.members.forEach(member => {
      console.log(`${member} is part of ${this.name}`);
    });
  }
};

team.introduceTeam();
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

4. クラスとコンストラクターで「this」を使用する

ES6 クラスまたはコンストラクター関数では、インスタンスのプロパティとして「this」を使用します。これにより、オブジェクト指向設計に従って、各インスタンスのデータが分離されます。

例:

Alice is part of Development Team
Bob is part of Development Team
Charlie is part of Development Team
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

5. さまざまなコンテキストで「this」をテストする

関数がメソッド、コールバック、イベント リスナーなどのさまざまなコンテキストで使用されたときに「this」がどのように動作するかをテストします。これは、開発の初期段階で予期しない結果を検出するのに役立ちます。

結論

このブログでは、JavaScript の "this" キーワードを調査し、グローバル、暗黙的、明示的、新しいバインディング、アロー関数などのさまざまなコンテキストでの動作を取り上げました。また、回避すべき一般的な落とし穴と、「これ」がコード内で期待どおりに動作することを確認するためのベスト プラクティスについても説明しました。 「これ」をマスターすると、コードの明瞭さと柔軟性が大幅に向上し、より効率的で保守しやすい JavaScript を作成できるようになります。

さらに詳しく知りたい場合は、JavaScript の "this" キーワードに関する MDN ドキュメントを参照してください。

以上がJavaScript の &#this&# キーワード: 初心者ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート