JavaScriptのアロー関数の特徴と通常の関数との違い

JavaScriptのアロー関数の特徴と通常の関数との違い

1. 矢印関数の使用

ES6 では、矢印=>を使用して関数式を定義する新しい方法が追加されました。多くの場合、矢印関数によって作成された関数と関数式の間に違いはなく、唯一の違いはそれらの記述方法です。

この記事の後半では、アロー関数と通常の関数の機能上の違いについて紹介します。

1. 通常関数から矢印関数へ

以下に示すように、関数を定義するには、 functionキーワードを使用できます。関数は 2 つのパラメーターabを受け取り、 abの合計を返します。

関数 getSum(a, b) {
    a + b を返します。
}

この関数を定義するために矢印関数を使用する場合は、 functionキーワードを省略し、矢印=>を使用して関数を定義して、次のように記述できます。

定数 getSum = (a, b) => {
    a + b を返します。
};

2. 中括弧を省略してリターンする

矢印関数を定義し、関数本体にreturnステートメントのみがある場合は、中括弧{}を省略してreturnことができます。

以下に示すように、矢印関数の完全な定義は次のとおりです。

定数 getSum = (a, b) => {
    a + b を返します。
};

この矢印関数の本体にはreturnステートメントのみがあります。中括弧{}returnを省略した後の簡略化された表記は次のようになります。

定数 getSum = (a, b) => a + b;

3. 括弧を省略する

定義された矢印関数にパラメータが 1 つしかない場合は、括弧を省略できます。

以下に示すように、定義された矢印関数には 1 つのパラメーターのみがあり、完全に記述されています。

定数関数 = (a) => {
    a + 2 を返します。
};

パラメータを囲む括弧は省略されており、次のコードは上記のコードと同等です。

定数関数 = a => a + 2;

: 関数にパラメータがない場合、または複数のパラメータがある場合は、括弧を使用する必要があります。

2. アロー関数と通常の関数の違い

ほとんどの場合、矢印関数はより簡潔であるため、通常の関数を使用できる場所であればどこでも使用できます。

しかし、場合によっては、矢印関数は通常の関数とは大きく異なります。

1. 矢印関数の this は親スコープの this である

次のコードは、通常の関数として定義されたメソッドgetThisを持つオブジェクトobjを定義し、ここでthis出力します。 obj.getThis()を呼び出すと、 objオブジェクトが出力されます。これは、メソッド内のthisオブジェクトobjを指していることを意味します。

定数オブジェクト = {
    名前: 'ジャック',
    getThis() {
        console.log(これを);
    },
};
obj.getThis(); // {name: 'Jack', getThis: ƒ}

同様に、オブジェクトobjが定義されていますが、その中のメソッドは矢印関数で定義されています。ブラウザでobj.getThis()が呼び出されると、 Windowが出力されます。これは、 objオブジェクトのメソッドが呼び出されても、メソッド内のthisobjを指すのではなく、 objが定義されているコンテキストのthisを指すことを示しています。

定数オブジェクト = {
    名前: 'ジャック',
    getThis: () => {
        console.log(これを);
    },
};
obj.getThis(); // ウィンドウ

2. call、apply、bindは矢印関数のthisを変更できない

次のコードでは、通常の関数getNamethis.nameを出力し、関数内のthis callを通じてobjにバインドし、 getNameを呼び出してobjの属性nameを出力します。

定数オブジェクト = {
    名前: 'ジャック',
};

関数 getName() {
    コンソールにログ出力します。
}
getName.call(obj); // ジャック

関数が矢印関数に変更されると、 call機能しなくなり、関数内のthis objにバインドできず、 undefined出力されます。

定数オブジェクト = {
    名前: 'ジャック',
};

定数 getName = () => {
    コンソールにログ出力します。
};
getName.call(obj); // 未定義

3. コンストラクタとして使用できない

矢印関数はコンストラクターとして使用できません。矢印関数をコンストラクターとして使用すると、次のコードに示すようにエラーが報告されます。

定数Person = () => {
    this.name = 'ジャック';
};
const usr = new Person(); // Personはコンストラクタではありません

4. 議論はしない

通常の関数内では、 argumentsを使用して、配列のようなオブジェクトである渡されたパラメータを取得できます。

関数func() {
    console.log(引数);
}
func(1, 2, 3); // [引数] { '0': 1, '1': 2, '2': 3 }

ただし、矢印関数ではargumentsオブジェクトを使用できず、入力パラメータを取得できません。

ブラウザでは、矢印関数でargumentsオブジェクトを使用すると、エラーが報告されます。

定数関数 = () => {
    // ブラウザ環境 console.log(arguments); // 引数が定義されていません
};
関数(1, 2, 3);

ただし、矢印関数は、入力パラメータをパラメータ内の...argsの形式で取得することができ、取得されたargsは配列です。

定数関数 = (...引数) => {
    console.log(引数); // [ 1, 2, 3 ]
};
関数(1, 2, 3);

5. 矢印関数はnew.targetをサポートしていない

通常の関数定義のコンストラクター内では、インスタンスを構築するコンストラクターを返すためにnew.targetがサポートされています。

関数Person() {
    this.name = 'ジャック';
    コンソールにログ出力します。
}
// コンストラクタを指します new Person(); // [関数: Person]

矢印関数では、 new.targetはサポートされていません。ブラウザ環境では、 new.targetを使用する矢印関数はnew.target expression is not allowed here

定数Person = () => {
    this.name = 'ジャック';
    コンソールにログ出力します。
}
// ブラウザ環境 new Person(); // ここでは new.target 式は許可されません

この記事の参考文献:

上級 JavaScript プログラミング (第 4 版)

以上で、JavaScript のアロー関数の特徴と通常の関数との違いについての説明は終了です。js アロー関数と通常の関数についてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • より良い JavaScript 条件文と一致条件を書くためのヒント (要約)
  • JSの矢印関数におけるこのポイントの詳細な説明
  • JavaScript の矢印関数と通常の関数の違いの詳細な説明
  • JS 矢印関数に適さないシナリオは何ですか?
  • JavaScript で矢印関数を使用できないシナリオはどれですか
  • JavaScript の条件付きアクセス属性と矢印関数の紹介

<<:  HTML の小さなタグの使用に関するヒント

>>:  MySQL テーブルとデータベースでデータを分割する方法

推薦する

HTMLエンコードによる文字化け問題について

今日、3年生から質問がありました。彼が書いた HTML コードを開くと、文字化けした文字が表示されま...

MySQL でコマンドを使用して階層検索を実現する方法の詳細な説明

序文この記事は主にMySQLコマンド階層検索ヘルプの使用に関する内容を紹介します。この記事のサンプル...

完全なMySQL学習ノート

目次MyISAM と InnoDBパフォーマンスの低下と SQL の速度低下の理由: MySQL 実...

Mysql5.7 で JSON 操作関数を使用する手順

序文JSON は、言語に依存しないテキスト形式を使用する軽量のデータ交換形式で、XML に似ています...

Linux でハイパースレッディング技術を動的に有効/無効にする方法の詳細な説明

序文Intel のハイパースレッディング テクノロジーにより、1 つの物理コア上で 2 つのスレッド...

CSS 命名: BEM、スコープ付き CSS、CSS モジュール、CSS-in-JS の説明

CSS の適用範囲はグローバルです。プロジェクトがどんどん大きくなり、参加する人が増えるにつれて、命...

Vueはドラッグアンドドロップを使用して構造ツリーを作成します

この記事の例では、ドラッグアンドドロップを使用して構造ツリーを作成するVueの具体的なコードを共有し...

Vite2+Vue3を使用してMarkdownドキュメントをレンダリングする練習

目次カスタム Vite プラグインvite-plugin-markdownの使用Front Matt...

JavaScript における BOM と DOM の詳細な説明

目次BOM (ブラウザ オブジェクト モデル) 1. ウィンドウブラウザのウィンドウサイズを取得する...

Windows 10 に付属する仮想マシンのネットワークを設定するための詳細な手順 (グラフィック チュートリアル)

1. サーバー ホストをクリックし、右側の操作リストで [仮想スイッチ管理] をクリックして、仮想...

MySQL のロックの仕組みと使用法の分析

この記事では、例を使用して MySQL のロック メカニズムと使用方法を説明します。ご参考までに、詳...

JavaScript コンストラクタとプロトタイプの関係

目次1. コンストラクタとプロトタイプ1. コンストラクター2. コンストラクタ問題3. コンストラ...

MySQLの累積集計原理と使用例の分析

この記事では、例を使用して、MySQL 累積集計の原理と使用方法を説明します。ご参考までに、詳細は以...

MySQL 1130例外、リモートログインできない解決策

目次質問: 1. リモートログイン権限を有効にする: 2. MySQLの権限を更新します。 3. テ...

CSSはインラインブロックのずれの問題を解決します

もうナンセンスじゃない、郵便番号HTML部分 <div class="positio...