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