JavaScript スコープチェーンの基本原理のグラフィカルな説明

JavaScript スコープチェーンの基本原理のグラフィカルな説明

序文

JavaScript を学ぶとき、外部空間から内部変数にアクセスできないことは誰もが知っておく必要があります。私たちはこの基本的なルールしか知らないことが多いのですが、この基本的なルールを実装するための基本的な原則は何でしょうか。今日は、白人の視点からスコープ チェーンを理解する方法をお見せし、皆さんのお役に立てればと思います。

範囲

1. スコープとは何ですか?

簡単に言えば、スコープとは、名前で変数を検索するための一連のルールです。スコープは、一般的に閉じた空間として理解できます。この空間は閉じられており、外部に影響を与えません。外部空間は内部空間にアクセスできませんが、内部空間はそれをラップする外部空間にアクセスできます。

2. [[スコープ]] プロパティ

JavaScript では、各関数はオブジェクトです。オブジェクトの一部のプロパティにはアクセスできますが、一部のプロパティには自由にアクセスできません。[[Scopes]] プロパティはその 1 つです。このプロパティは、JavaScript エンジンによってのみ読み取ることができます。

実際、[[scope]] はスコープと呼ばれることが多く、スコープ ランタイムのコンテキスト コレクションを格納します。

ここでは、func.prototype.constructorとfuncは同じ関数を指しているので、関数funcのプロトタイプオブジェクトにアクセスして[[Scopes]]プロパティを表示します。

3. スコープチェーン

[[scope]] に格納されている実行コンテキスト オブジェクトのコレクションは相互にリンクされており、このチェーン接続をスコープ チェーンと呼びます。 JavaScript はスコープ チェーンを通じて変数を検索し、スコープ チェーンの上から下に向かって検索します (オブジェクトが検索される関数のスコープ チェーンが検索されます)。

4. 変数を見つける原理の図解

//次のコードを例として、スコープチェーンを通じて変数を検索する JavaScript の原理を説明します**
関数a() {
  関数b() {
  //ここで示したbの元の値は234でしたが、コメント欄で次の数字が123と書かれていることに気づいたので、bの値を123に変更しました。
      var b = 123;
  }
  var a = 123;
  関数b();
}
var glob = 100;

1. グローバル関数a()が定義されると、スコープチェーンは次のようになります。

関数の [[Scopes]] プロパティは、スコープ チェーン オブジェクトを指します。この時点で、スコープ チェーンには、グローバル オブジェクトを指すキーと値のペアが 1 つだけあります。グローバル オブジェクトには、グローバルにアクセスできるもの、つまり、誰でもアクセスできる最も外側のスコープが格納されます。

2. グローバル関数a()がアクティブ化されて呼び出されると、スコープチェーンは次のようになります。

このとき、スコープ チェーンが最初にアクセスできるのは、アクティベーション オブジェクト内のキーと値のペアです。キーと値のペアがない場合は、グローバル オブジェクトにアクセスします。

3. 関数bが関数a()内で定義されている場合、bのスコープチェーンは次のようになります。

b が定義されているだけで呼び出されていない場合、b のスコープ チェーンは a のスコープ チェーンと同じになります。

4. 関数a()内の関数bがアクティブ化されて呼び出されると、スコープチェーンは次のようになります。

スコープ チェーンは、最初に関数 b() のアクティベーション オブジェクトを指します。変数の検索もスコープ チェーンの順序でアクセスされ、変数が見つかると停止します。

要約する

外側のスコープが内側のスコープにアクセスできない理由は、外側のスコープのスコープ チェーンに内側のスコープのアクティベーション オブジェクトがないため、内部変数にアクセスできないためです。内側のスコープが変数にアクセスする順序は、スコープ チェーンに従います。最初に内部を調べ、見つからない場合は、アプリケーション スコープ チェーンに沿って外側を調べます。外側のスコープはグローバル スコープです。

JavaScript スコープ チェーンの基本原理に関するこの記事はこれで終わりです。JavaScript スコープ チェーンに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript 上級プログラミング: 変数とスコープ
  • JavaScript の静的スコープと動的スコープを例を使って説明します
  • Javascript のスコープとクロージャの詳細
  • JS の難しさ 同期と非同期、スコープとクロージャ、プロトタイプとプロトタイプ チェーンの詳細な説明
  • Vue.js スロットにおけるスコープ付きスロットの使用法の詳細な説明
  • js 実行コンテキストとスコープの概要
  • JS のスコープの問題に関する考えと共有

<<:  Docker イメージのデフォルトの保存場所を変更する方法 (ソリューション)

>>:  グリッドはページのレイアウトプランです

推薦する

Vue でインデックスをキー属性値として使用することが推奨されないのはなぜですか?

目次序文キーの役割差分アルゴリズムにおけるキーの役割ヘッドノードを同期するテールノードを同期する新し...

MySQLインスタンスが起動できない問題の分析と解決

目次序文シナリオ分析要約する序文数日前、友人がWeChatで私に連絡してきて、マシンがダウンタイムか...

mysqlは時間を自動的に追加し、時間を自動的に追加および更新する操作を実装します

時間フィールドは、データベースの使用時によく使用されます。よく使われるのは作成時間と更新時間です。し...

rpm を使用して指定されたバージョンの docker (1.12.6) をインストールする詳細な手順

1. 理由システムが Centos7.3 の場合、yum install docker を使用して直...

MySQL インデックスの詳細な説明

目次1. インデックスの基本1.1 はじめに1.2 インデックスの仕組み1.3 インデックスの種類1...

Vue は左右のスライド効果のサンプルコードを実装します

序文個人の実際の開発で使用した効果問題を、今後の開発やレビューに役立てるためにまとめています。他の人...

CSS は Google マテリアル デザインのテキスト入力ボックス スタイルを実装します (推奨)

みなさんこんにちは。今日は、純粋な CSS を使用して Google マテリアル デザインのテキスト...

1 つの記事で MySQL のプリコンパイルを理解する

1. プリコンパイルの利点私たちは皆、プリコンパイル機能を備えた JDBC の PreparedSt...

MySQL 5.5.27 winx64 のインストールと設定方法のグラフィックチュートリアル

1. インストールパッケージMYSQLサービスダウンロードアドレス:MySQL公式サイトからダウンロ...

MySQL の自己結合重複排除に関する注意事項

機能シナリオを簡単に説明しましょう。データ行フィールドは次のとおりです。名前開始日時タイプこの表では...

CentOS7 から CentOS8 にアップグレードする方法 (詳細な手順)

この記事では、具体的な例を使用して、CentOS 7 から CentOS 8 にアップグレードする方...

JS を使用してデータ型を決定する 4 つの方法

目次序文1. 型2. インスタンス3. コンストラクター詳細: 4. 文字列要約する序文Javasc...

JavaScript デザインパターン 責任連鎖パターン

目次概要コードの実装パラメータ定義成し遂げる責任連鎖パターンの実装改善概要責任チェーン パターンは、...

ユーザー名が使用可能かどうかを確認するVueメソッド

この記事では、ユーザー名が使用可能かどうかを確認するためのVueの具体的なコードを例として紹介します...

VMware 仮想マシンに CentOS と Qt をインストールするチュートリアル図

VMware のインストールパッケージのインストールダウンロードアドレス: https://www....