P粉5462579132023-08-22 12:41:43
JavaScript はスコープ チェーンを使用して、特定の関数のスコープを決定します。通常はグローバル スコープがあり、定義された各関数には独自のネストされたスコープがあります。別の関数内で定義された関数には、外部関数にリンクされたローカル スコープがあります。これは常に、スコープが定義されるソース コード内の場所です。
スコープ チェーン内の要素は、基本的には親スコープへのポインターを持つマップです。
変数を解析するとき、JavaScript は最も内側のスコープから開始して外側に向かって検索します。
P粉1655228862023-08-22 10:58:25
JavaScript には、字句 (静的とも呼ばれる) スコープとクロージャがあります。これは、ソース コードを確認することで識別子のスコープを決定できることを意味します。
4 つのスコープは次のとおりです:
グローバル スコープとモジュール スコープの特殊な場合を除き、変数は var
(関数スコープ)、let
(ブロック スコープ)、および const
(ブロック スコープ) を使用します。 ) 宣言。厳密モードでは、他のほとんどの形式の識別子宣言はブロック スコープを持ちます。
字句環境は、識別子名とそれに関連付けられた値の間のマッピングです。
スコープは、リンクされた字句環境のネストによって形成され、各ネスト レベルは祖先実行コンテキストの字句環境に対応します。
これらのリンクされた語彙環境は、スコープ「チェーン」を形成します。識別子の解決は、このチェーンに沿って一致する識別子を検索するプロセスです。
識別子の解析は外部に対してのみ行われます。このように、外部の語彙環境は内部の語彙環境を「見る」ことができません。
JavaScript で識別子の
スコープを決定する場合、次の 3 つの関連要素があります。 識別子の宣言方法
var
、const
関数パラメータ
キャッチブロックパラメータインポート
ステートメント評価
一部の識別子の宣言場所:
関数本体
を持ちます。その場合、それらはグローバル オブジェクトのプロパティとして追加され、グローバル スコープ領域を持ちます。 eval
関数での使用には別のルールがあります。
letとconst
を使用して宣言された識別子は、グローバル コンテキストで直接宣言されていない限り、ブロック スコープ
を持ちます。グローバル コンテキストで直接宣言されている場合、グローバル スコープ を持ちます。
注: let、
、および var
はすべて昇格されます
。これは、定義の論理的な場所が、それを囲んでいるスコープ (ブロックまたは関数) の先頭にあることを意味します。ただし、let
および const を使用して宣言された変数は、制御フローがソース コード内の宣言ポイントを通過するまで、読み取りまたは割り当てを行うことができません。この一時的な期間を一時的な不感帯と呼びます。
リーリー