JSの実行コンテキストとスコープ

1.実行コンテキストおよび実行スタック

JavaScriptの実行コンテキストが解析され、現在のコードと実行の抽象化は、任意のコンテキストで実行されているJavaScriptコードが実行中に実行されている環境です。

ライフサイクルの実行コンテキストは、3つの段階に分かれます回復局面の作成段階→→実装フェーズは、私たちが作成段階に焦点を当てます。

作成段階では(関数が前に呼び出されますが、その内部コードのいずれかを実行しなかった場合)は、次の3つのことを行います。

  • 関数宣言と変数宣言を高めるために、最初の初期化パラメータの引数機能:変数のオブジェクトを作成します。

  • スコープチェーンを作成します。

  • この点を決定

機能テスト(引数){
 // 1 argパラメータが「Hi」の
// 変数宣言以外の関数宣言より高い優先順位ため2.この場合、引数の関数であるよう
にconsole.log(引数);
 VARの引数=「こんにちは」 ; // 3.var Argの変数宣言は無視され、引数= 'ハロー'行われる
機能のArg(){ 
  にconsole.log( 'Hello Worldの' 
} 
はconsole.log(アルギニン); 
} 
テスト( 'ハイ' );
 / * 出力:
機能のArg(){ 
  にconsole.log( 'Hello Worldの'); 
} 
ハロー
* /

 

関数が実行されたときに、これは、最初に新しいプライベートスコープを形成し、そして次の手順で実行されます。

  • 物理的パラメータ場合は、パラメータの割り当てを与えます

  • 予備範囲を民営説明、機能は、前者の最終によってカバーされる変数宣言、より高い優先順位を宣言が、再割り当てすることができます

  • 上から下に実行されるコードのプライベート範囲

 

どのように実行コンテキスト、それを管理するためにそんなに作成した新しい実行コンテキストを作成するための機能に、より多くの機能の実行コンテキストが存在し、各呼び出しを、より機能?

JavaScriptエンジンは、実行コンテキストを管理するための実行スタックを作成します。それは続くアウト基礎の原則の後、ストレージ関数呼び出しの実行スタックのスタック構造とみなすことができます

約示した例に//ムーコースノート参照:
はconsole.log(1 ); 機能PFN(){ にconsole.log( 2 ); 関数CFN(){ にconsole.log( 3 ); }())。 console.log( 4 ;) } PFN() はconsole.log( 5 ); // 出力:12345

上記のフローチャートから、我々はいくつかの重要なポイントを覚えておく必要があります。

  • JavaScriptは、すべてのコードは、実行のためにキューに入れられ、単一のスレッド上で実行されます。

  • グローバルブラウザのコードの実装を始め、最初のグローバル実行コンテキストを作成すると、実行スタックの最上部に圧入。

  • 作成された機能実行コンテキストを行う機能を入力し、それが実行スタックの最上部に圧入されるたびに。この機能の終了が実行された後、現在の実行コンテキストスタック機能、およびガベージコレクションのため。

  • 実行コンテキストへのJS実行エンジンのブラウザアクセスは、常にスタックの最上位です。

  • ブラウザを閉じたときにのみ、グローバルコンテキストがあり、それがポップ。

 

2.スコープとスコープチェーン

JavaScriptをES6到着は、グローバルスコープ、関数スコープと(新しいES6)ブロックレベルの範囲を有します。

我々は理解することができます:適用範囲は、独立したサイトで、変数はにさらされ、開示されることはありませんように。そのスコープは、変数を分離することで、異なるスコープに同じ名前の変数が競合は存在しません最も有用です

 

関数スコープ:変数名を示しているが、体の内部にアクセスするには、この機能であり、もちろん、あなたは、地域間のアクセスのローカル変数のスコープを達成するためにクロージャを使用することができます。ビュー

ブロックレベルのスコープ:ES6は新しいが、letコマンドでブロックレベルのスコープを追加し、外側のスコープは、最も内側のスコープに非常に安全かつ簡単な取得することはできません。外側及び内側層は、同じ変数名を使用している場合、また、互いに干渉する。

次は、次の理解に来て自由変数を(つまり、グローバル変数です)。

 

以下のコードでは、にconsole.logは、(A)(Bを比較することができる)が、しない範囲の現在の定義では、変数を取得します。変数の現在のスコープが定義されていない、それは自由変数です。

VaRの A = 100
 関数のFn(){
  VARの B = 200である
  にconsole.log(A)// ここで、この変数100に自由で
  はconsole.log(B)// 200である 
} 
のFn()

 

次に、例を見て:

関数F1(){
  VARの A = 100
  戻り 関数(){ 
    にconsole.log(A)
  } 
} 
関数F2(F1){
  VAR A = 200 
  にconsole.log(F1())
} 
VARの F1 = F1()
F2(F1 )// 100

ので、上記のコード、自由変数の値が、代わりF2の関数F1を探す自由変数は、関数が定義されている場合、関数が実行されていないスコープチェーンに基づいて、スコープチェーンを見つけるために、場合。

 

それでは、どのように自由変数の値を得るのですか?-親スコープ(関数の親スコープを作成する)見つけます

親はそれがなかった場合は?あなたが見つけグローバルスコープかどうかを見つけるまで、その後、層によって層を見上げ、彼は放棄しました。層によるこの関係層は、スコープチェーンです。

 

おすすめ

転載: www.cnblogs.com/hai-cheng/p/11119632.html