ホームページ ウェブフロントエンド jsチュートリアル JavaScript の &#this&# が他の OOP 言語と異なる理由

JavaScript の &#this&# が他の OOP 言語と異なる理由

Jan 17, 2025 pm 02:34 PM

Why

JavaScript の this キーワードは、特に self が一貫して現在のオブジェクト インスタンスを参照する C#、Java、または Python などの言語から来た開発者にとって、混乱を引き起こすことがよくあります。 これらの言語とは異なり、JavaScript の this は動的であり、その値は関数の呼び出しコンテキストによって決定されます。このガイドでは、this の動作に影響を与えるさまざまなシナリオを要約します。

1.グローバルスコープ:

  • 非厳密モード: this はグローバル オブジェクト (ブラウザーでは window、Node.js では global) を指します。
console.log(this); // window or global
ログイン後にコピー
ログイン後にコピー
  • 厳密モード: thisundefined.
"use strict";
console.log(this); // undefined
ログイン後にコピー
ログイン後にコピー

2.関数内:

  • 通常の関数: 非厳密モードでは、this はグローバル オブジェクトを参照します。厳密モードでは、undefined です。
function myFunc() {
  console.log(this); 
}
myFunc(); // window (non-strict), undefined (strict)
ログイン後にコピー
ログイン後にコピー

3.オブジェクトメソッド:

  • 関数がオブジェクト メソッドとして呼び出される場合、this はそのオブジェクトを参照します。
const myObj = {
  name: "JavaScript",
  greet() {
    console.log(this.name); // this refers to myObj
  }
};
myObj.greet(); // Output: JavaScript
ログイン後にコピー

4.アロー関数:

  • アロー関数には独自の this がありません。これらは、語彙スコープ (周囲のコンテキスト) から this を継承します。
const myObj = {
  name: "JavaScript",
  arrowFunc: () => {
    console.log(this.name); // Inherits this from the global scope
  }
};
myObj.arrowFunc(); // undefined (in browsers, this is window)
ログイン後にコピー

5.コンストラクター:

  • コンストラクター関数またはクラス内で、this は新しく作成されたインスタンスを参照します。
class Person {
  constructor(name) {
    this.name = name;
  }
  greet() {
    console.log(`Hello, ${this.name}`);
  }
}

const person = new Person("Alice");
person.greet(); // Output: Hello, Alice
ログイン後にコピー

6.明示的なバインディング (callapplybind):

JavaScript 関数は、call を明示的に設定するためのメソッド (applybindthis) を持つオブジェクトです。

  • callapply は、指定された this 値で関数を呼び出します。 call はカンマ区切りの引数を使用します。 apply は配列を受け取ります。
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
ログイン後にコピー
  • bind は、this が永続的にバインドされた新しい関数を返します。
const boundGreet = greet.bind(user);
boundGreet("Hello"); // Output: Hello, Alice
ログイン後にコピー

7.イベントリスナー:

  • 通常の関数: this は、イベントをトリガーする要素を指します。
const btn = document.querySelector("button");
btn.addEventListener("click", function() {
  console.log(this); // The button element
});
ログイン後にコピー
  • アロー関数: this は要素ではなく、周囲のスコープから継承します。
btn.addEventListener("click", () => {
  console.log(this); // this depends on the arrow function's definition context
});
ログイン後にコピー

8. setTimeout / setInterval:

  • 通常の関数: this のデフォルトはグローバル オブジェクトです。
setTimeout(function() {
  console.log(this); // window in browsers
}, 1000);
ログイン後にコピー
  • アロー関数: this は字句的に継承されます。
setTimeout(() => {
  console.log(this); // Inherits this from surrounding context
}, 1000);
ログイン後にコピー

9.クラス:

  • クラス メソッド内では、this はクラス インスタンスを参照します。
console.log(this); // window or global
ログイン後にコピー
ログイン後にコピー

10.コンテキスト損失 (メソッド抽出):

メソッドを変数に割り当てたり、コールバックとして渡すと、this バインディング損失が発生する可能性があります。

"use strict";
console.log(this); // undefined
ログイン後にコピー
ログイン後にコピー

解決策: .bind(obj) またはアロー関数を使用してコンテキストを維持します。

11. new キーワード:

関数で new を使用すると、新しいオブジェクトが作成され、this はそのオブジェクトを参照します。

function myFunc() {
  console.log(this); 
}
myFunc(); // window (non-strict), undefined (strict)
ログイン後にコピー
ログイン後にコピー

概要テーブル:

コンテキスト
Context this Refers To
Global (non-strict) Global object (window/global)
Global (strict) undefined
Object Method The object owning the method
Arrow Function Lexical scope (surrounding context)
Constructor/Class The instance being created
call, apply, bind Explicitly defined value
Event Listener The element triggering the event
setTimeout/setInterval Global object (regular function), lexical scope (arrow function)
new Keyword The newly created object
を参照 グローバル (非厳密) グローバル オブジェクト (ウィンドウ/グローバル) グローバル (厳密) 未定義 オブジェクトメソッド メソッドを所有するオブジェクト アロー関数 語彙範囲 (周囲のコンテキスト) コンストラクター/クラス 作成中のインスタンス 呼び出し適用バインド 明示的に定義された値 イベント リスナー イベントをトリガーする要素 setTimeout/setInterval グローバル オブジェクト (通常の関数)、語彙スコープ (アロー関数)

キーワード

新しく作成されたオブジェクト テーブル> thisこれらのシナリオを理解することは、正しく予測可能な JavaScript コードを作成するために重要です。 予期しない 動作を避けるために、必要に応じて明示的バインディングなどのテクニックを利用することを忘れないでください。

以上がJavaScript の &#this&# が他の OOP 言語と異なる理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JavaScriptの文字列文字を交換します JavaScriptの文字列文字を交換します Mar 11, 2025 am 12:07 AM

JavaScriptの文字列文字を交換します

jQuery日付が有効かどうかを確認します jQuery日付が有効かどうかを確認します Mar 01, 2025 am 08:51 AM

jQuery日付が有効かどうかを確認します

jQueryは要素のパディング/マージンを取得します jQueryは要素のパディング/マージンを取得します Mar 01, 2025 am 08:53 AM

jQueryは要素のパディング/マージンを取得します

10 jQuery Accordionsタブ 10 jQuery Accordionsタブ Mar 01, 2025 am 01:34 AM

10 jQuery Accordionsタブ

10 jqueryプラグインをチェックする価値があります 10 jqueryプラグインをチェックする価値があります Mar 01, 2025 am 01:29 AM

10 jqueryプラグインをチェックする価値があります

ノードとHTTPコンソールを使用したHTTPデバッグ ノードとHTTPコンソールを使用したHTTPデバッグ Mar 01, 2025 am 01:37 AM

ノードとHTTPコンソールを使用したHTTPデバッグ

カスタムGoogle検索APIセットアップチュートリアル カスタムGoogle検索APIセットアップチュートリアル Mar 04, 2025 am 01:06 AM

カスタムGoogle検索APIセットアップチュートリアル

jQueryはscrollbarをdivに追加します jQueryはscrollbarをdivに追加します Mar 01, 2025 am 01:30 AM

jQueryはscrollbarをdivに追加します

See all articles