ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript の this キーワードを理解する

JavaScript の this キーワードを理解する

Mary-Kate Olsen
リリース: 2024-12-18 16:21:10
オリジナル
218 人が閲覧しました

Understanding the this Keyword in JavaScript

JavaScript の this キーワード

this キーワードは、JavaScript の最も強力な機能の 1 つですが、誤解されています。これは関数が実行されるコンテキストを指し、関数の呼び出し方法によって異なります。


1.これは何ですか?

この値は、実行コンテキスト、つまり関数が実行される環境によって決まります。通常、これはオブジェクトを指しますが、その正確な値は、関数がどこでどのように呼び出されるかによって異なります。


2.仕組み

A.グローバルコンテキスト

グローバル実行コンテキスト (関数の外側) では、これはグローバル オブジェクトを指します:

  • ブラウザの場合: ウィンドウ
  • Node.js の場合: グローバル

:

console.log(this); 
// In a browser: window
// In Node.js: global
ログイン後にコピー
ログイン後にコピー

B.通常の関数内

関数がグローバル スコープで呼び出される場合、これはデフォルトでグローバル オブジェクトになります (非厳密モード)。厳密モードでは、これは未定義です。

:

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

showThis(); 
// Non-strict mode: window (global object)
// Strict mode: undefined
ログイン後にコピー
ログイン後にコピー

C.オブジェクトメソッド内

関数がオブジェクトのメソッドとして呼び出される場合、これはオブジェクト自体を参照します。

:

const obj = {
  name: "JavaScript",
  getName: function () {
    console.log(this.name);
  },
};

obj.getName(); // Output: JavaScript
ログイン後にコピー
ログイン後にコピー

D.コンストラクター関数の内部

コンストラクター関数では、これは新しく作成されたオブジェクトを参照します。

:

function Person(name) {
  this.name = name;
}

const john = new Person("John");
console.log(john.name); // Output: John
ログイン後にコピー
ログイン後にコピー

E.アロー関数内

アロー関数には独自の this がありません。代わりに、周囲の語彙スコープからこれを継承します。

:

const obj = {
  name: "JavaScript",
  getName: function () {
    const arrowFunc = () => console.log(this.name);
    arrowFunc();
  },
};

obj.getName(); // Output: JavaScript
ログイン後にコピー
ログイン後にコピー

3.これをバインドします

呼び出し、適用、またはバインドを使用して、この値を明示的に設定できます。

A.通話を使用する

特定の this 値と個別に指定された引数を使用して関数を呼び出します。

:

function greet(greeting) {
  console.log(`${greeting}, ${this.name}`);
}

const user = { name: "Alice" };
greet.call(user, "Hello"); // Output: Hello, Alice
ログイン後にコピー
ログイン後にコピー

B. apply を使用する

呼び出しと同じように動作しますが、引数を配列として受け取ります。

:

greet.apply(user, ["Hi"]); // Output: Hi, Alice
ログイン後にコピー
ログイン後にコピー

C.バインドの使用

指定されたオブジェクトに永続的に設定された新しい関数を返します。

:

const boundGreet = greet.bind(user);
boundGreet("Hey"); // Output: Hey, Alice
ログイン後にコピー

4.このの一般的な使用例

A.イベントハンドラ

イベント リスナーでは、イベントをトリガーした要素を指します。

:

console.log(this); 
// In a browser: window
// In Node.js: global
ログイン後にコピー
ログイン後にコピー

B.動的オブジェクトメソッド

これにより、オブジェクトがメソッドを動的に共有できるようになります。

:

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

showThis(); 
// Non-strict mode: window (global object)
// Strict mode: undefined
ログイン後にコピー
ログイン後にコピー

C.クラスメソッド

クラスでは、これは現在のインスタンスを指します。

:

const obj = {
  name: "JavaScript",
  getName: function () {
    console.log(this.name);
  },
};

obj.getName(); // Output: JavaScript
ログイン後にコピー
ログイン後にコピー

5.よくある落とし穴とベストプラクティス

A.コンテキストを失う

メソッドが変数に割り当てられると、元のコンテキストが失われる可能性があります。

:

function Person(name) {
  this.name = name;
}

const john = new Person("John");
console.log(john.name); // Output: John
ログイン後にコピー
ログイン後にコピー

解決策: バインド関数またはアロー関数を使用します。

const obj = {
  name: "JavaScript",
  getName: function () {
    const arrowFunc = () => console.log(this.name);
    arrowFunc();
  },
};

obj.getName(); // Output: JavaScript
ログイン後にコピー
ログイン後にコピー

B.コールバック関数内

コールバック内の this はコンテキストを失うことがよくあります。

:

function greet(greeting) {
  console.log(`${greeting}, ${this.name}`);
}

const user = { name: "Alice" };
greet.call(user, "Hello"); // Output: Hello, Alice
ログイン後にコピー
ログイン後にコピー

解決策: アロー関数を使用します。

greet.apply(user, ["Hi"]); // Output: Hi, Alice
ログイン後にコピー
ログイン後にコピー

6.概要

  • これは関数の実行コンテキストを指します。
  • アロー関数では、これは字句スコープから継承されます。
  • 呼び出し、適用、またはバインドを使用して、この値を明示的に設定します。
  • コードのバグを避けるために、これがさまざまなコンテキストでどのように動作するかを理解します。

これをマスターすると、JavaScript の動作をより深く理解できるようになり、よりクリーンで予測可能なコードを作成できるようになります。

こんにちは、アバイ・シン・カタヤットです!
私はフロントエンドとバックエンドの両方のテクノロジーの専門知識を持つフルスタック開発者です。私はさまざまなプログラミング言語やフレームワークを使用して、効率的でスケーラブルでユーザーフレンドリーなアプリケーションを構築しています。
ビジネス用メールアドレス kaashshorts28@gmail.com までお気軽にご連絡ください。

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

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