JSの矢印関数におけるこのポイントの詳細な説明

JSの矢印関数におけるこのポイントの詳細な説明

矢印関数は ES6 の新機能です。独自の this はありません。その this ポイントは外部のコード ベースから継承されます。

矢印関数を使用する際には、いくつか留意すべき点があります。

  • 矢印関数はコンストラクタとして使用できず、使用するとエラーが発生します。
  • 引数パラメータは使用できません。使用したい場合はrestを使用してください。
  • yieldコマンドは使用できないため、矢印関数をジェネレータ関数として使用することはできません。
  • 独自の this がないため、bind、call、apply を通じて this ポインターを変更することはできません。
  • しかし、これは矢印関数の this ポインターが静的であることを意味するわけではありません。外側のコード ライブラリの this ポインターを変更することで制御できます。
  • 矢印関数の this は外部のコード ベースから継承されるため、矢印関数の this は定義時にバインドされますが、通常の関数の this は呼び出されたときに決定されます。
  • リテラルオブジェクト内で直接定義された矢印関数のthisはオブジェクトにバインドされず、外側に向けられます。最も単純なケースはwindowにバインドすることです。

PS: 実際の開発環境では、React は矢印関数を使用して古典的な問題を解決できますが、ここでは詳しく説明しません。

矢印関数の動作を例で見てみましょう。

定数オブジェクト = {
  fun1: 関数() {
    console.log(これを);
    戻り値 () => {
      console.log(これを);
    }
  },
  fun2: 関数() {
    関数を返す(){
      console.log(これを);
      戻り値 () => {
        console.log(これを);
      }
    }
  },
  楽しい3: () => {
    console.log(これを);
  }
}

f1 = obj.fun1(); // オブジェクト
f1() // オブジェクト

f2 = obj.fun2() とします。
let f2_2 = f2(); // ウィンドウ
f2_2() // ウィンドウ

obj.fun3(); // ウィンドウ

出力の各行の分析:

let f1 = obj.fun1() // obj

これは明らかに暗黙のバインディングであり、fun1のthisはobjを指しています。

f1() // obj

前の行で返された矢印関数がここで実行されます。前のコードベースのthisがobjを指していることを解析すると、直接継承され、矢印関数thisが指している

objlet f2 =obj.fun2()

fun2 が最初のレベルで実行されると、コードは出力されません。代わりに、関数が返され、f2 に割り当てられます。ここでバインディングの損失が発生し、this は元の obj ではなく window を指します (割り当てが発生)。

let f2_2 = f2() // window

f2()が実行され、リバウンドthis——windowが出力され、矢印関数が返されてf2_2fに割り当てられます。

2_2() // window

実行してwindowを出力します。外側のコードのthisはwindowを指していませんか?ここではwindowを継承してthisとします。

obj.fun3() // window

リテラル内で直接定義された矢印関数はオブジェクトの this を継承できませんが、1 層外側を見て window を見つけます。これは、リテラル オブジェクトは独自のスコープを形成できないのに対し、コンストラクターは形成できるためです。

では、矢印関数の this ポインターをどのように操作するのでしょうか?

答えは、外側のコード ベースの this ポインターを変更し、矢印関数を定義する前に this の方向を変更することです。

上記のコードに基づいて:

fun4 = f2.bind(obj)() // オブジェクト
fun4() // オブジェクト

第 2 レベル メソッドの this ポインターが変更され、矢印関数も継承されていることがわかりました。

  fun2: 関数() {
    return function () { // ここでこれを変更します
      console.log(これを);
      return () => { // ここで定義すると継承されます console.log(this);
      }
    }
  },

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • JavaScript関数の詳細な説明これを指す問題
  • JavaScript プロトタイプオブジェクトの this ポイント問題の詳細な説明
  • このリファレンスとJavaScriptのカスタムプロパティの詳細な説明
  • JavaScriptのthisキーワードは

<<:  Navicatを使ってMySQLを操作する方法

>>:  CSS3 は下部に固定されたフッターを実装します (ページの高さに関係なく常に下部にあります)

推薦する

MySQL binlog ログを開く方法

binlog は、すべての mysql dml 操作を記録するバイナリ ログ ファイルです。 bin...

製品を選択した後、右下隅に√記号を表示するための純粋なCSS

おすすめの記事: CSS 疑似クラスの右下隅をクリックすると、選択を示すチェックマークが表示されます...

VMware Workstation のインストール (Linux カーネル) Kylin グラフィック チュートリアル

この記事では、VMware WorkstationにKylinをインストールする方法を参考までに紹介...

Vue.jsクラウドストレージで画像アップロード機能を実現

序文ヒント:以下はこの記事の主な内容です。以下のケースを参考にしてください。 1. オブジェクトスト...

Web2.0: 情報過多の原因と解決策

<br />情報の重複、情報過多、情報強迫、パーソナライズされたカスタマイズ、検索エンジ...

mysql バッチで大量のデータを削除する

mysql バッチで大量のデータを削除する1000万件のレコードを持つテーブル(syslogs)があ...

Javascript 操作メカニズム イベントループ

目次1. 4つのコンセプト1. JavaScriptはシングルスレッドです2. タスクキュー3. 同...

Docker Docker の保存場所を変更する コンテナイメージのサイズ制限を変更する操作

これは新しいバージョンではもう不可能なようで、推奨されません。そうでない場合は、ソフト リンクを直接...

ethers.js を使用して Solidity スマート コントラクトをデプロイする方法

Ethereum 上で DApps を開発したことがある場合は、フロントエンド JavaScript...

VueプロジェクトにPWAを導入する手順

目次1. 依存関係をインストールする2. vue.config.js ファイルで pwa を設定しま...

サーバー同時実行数の推定式と計算方法

最近、サーバーのストレステストを再度行う必要が出てきました。ここでは、最近学んだ見積もりスキームと見...

JavaScript の基礎: 即時実行関数

目次関数フォーマットを即時実行関数を即座に実行する他の方法 – 式即時実行される関数はパラメータを取...

Tomcat イメージをインストールして Docker に Web プロジェクトをデプロイする方法を簡単に説明します。

1. Tomcatをインストールする1. Docker HubでTomcatイメージを見つける d...

Linux 上での Go 環境の構築のインストールと設定の説明

Linux で Go 環境を構築するのは非常に簡単です。 1. go1.2.1.linux-386....

Linux ユーザーとグループのコマンド例分析 [切り替え、ユーザーの追加、権限制御など]

この記事では、Linux のユーザーおよびグループのコマンドについて例を挙げて説明します。ご参考まで...