ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript スコープチェーンと実行環境

JavaScript スコープチェーンと実行環境

迷茫
迷茫オリジナル
2017-03-26 16:49:011175ブラウズ

スコープ、スコープ チェーン、実行環境、実行環境スタックの概念は、よく混同されますが、ここで整理してみましょう。ローカル スコープ関数内の領域です。 is window;

  1. スコープチェーンは、関数が宣言されたときの位置に依存し、最初に現在のスコープを検索し、次にグローバルの場所まで外側に検索します。関数が呼び出されます。

  2. 実行環境は、関数にアクセスできるデータと変数のコレクションです。つまり、関数のスコープ チェーン内のすべてのデータと変数です。

  3. 実行環境スタックは以下に基づいています。コードの実行順序、および各実行環境はスタックの形式です。レイヤーごとにアクセスし、使い果たされたら終了して破棄します。現在の実行環境 (現在のスコープ チェーンにデータと変数を保存する) が見つからない場合。変数は見つからず、以前の実行環境では検索されません。

  4. スコープ
  5. JavaScript にはブロックレベルのスコープの概念がありません。 : 変数は、宣言されている関数本体とそのサブ関数内で表示されます。

  6. スコープとは、変数や関数のアクセス可能なスコープであり、変数や関数の可視性やライフサイクルを制御します。JavaScriptでは、変数のスコープにはグローバルスコープとローカルスコープがあります。

変数が関数内で宣言されていないか、var なしで宣言されている場合、それはグローバル変数であり、グローバル スコープを持ちます。

        <script type="text/javascript">
            function test1(){
                a = 1;//全局变量,只有在当前函数运行时,才有效            }
            test1();
            console.log(a);//1       注意test1函数必须运行,不然找不到a
        </script>
  • グローバル変数は、ウィンドウ オブジェクトの属性として使用できます。同じです。

        <script type="text/javascript">    
            var b = 1;//全局变量            
            console.log(b === window.b);
            //true  全局变量可以当做window对象的属性用,他们是一样的;
        </script>
  • window オブジェクトのすべてのプロパティはグローバル スコープを持ち、コード内のどこからでもアクセスできます。

    関数内で宣言された変数は、関数本体内でのみ使用できます。関数のパラメータは var を使用しませんが、それでもローカル変数です。
  •         <script type="text/javascript">    
                var c = 1;//全局变量//            
                console.log(d);//ReferenceError: d is not defined    引用错误,当前作用域就是最外层作用域,依然找不到d
                function test2(d){
                    console.log(c);
                    //1   全局变量,哪都可以访问;(先找当前作用域,找不到,就向外层作用域找,直到window最外层,找到了)                console.log(d);//3   形参是局部变量,只有当前作用域下可以访问            }
                test2(3);        
                </script>
  • スコープチェーン
  • スコープチェーンは、関数が宣言されたときの位置に依存し、現在のスコープで見つからない場合、エンジンは現在のスコープから検索を開始します。外側の層。変数が見つかるか、最も外側のスコープ (つまり、グローバル スコープ) に到達するまで、ネストされたスコープ内で検索を続けます。

    そのルートは決定されており、関数が実行される場所とは関係ありません。
同じ名前の識別子は、複数レベルのネストされたスコープで定義できます。これは、内部識別子が window.a を通じて外部識別子を「シャドウ」する効果と呼ばれます。同じ名前の変数によって隠蔽されます。ただし、非グローバル変数が隠蔽されている場合、いずれにしてもアクセスできません。

        <script type="text/javascript">
            var a = 1;            
            var b = 2;            
            var c = 3;            
            var d = 4;            
            function inner(d) {//它的作用域链是inner---全局
                var c = 8;
                
                console.log(a);//1  当前作用域找不到a,去全局作用域找到了a=1                console.log(b);//2  当前作用域找不到b,去全局作用域找到了b=2                console.log(c);//8  当前作用域找到了c=8                console.log(d);//7  当前作用域找到了d=7,形参也是局部作用域
            //    console.log(e);//ReferenceError: e is not defined   引用错误,找不到e, 它的作用域链是inner---全局                console.log(a+b+c+d);//18            }            function outter(e) {                var a = 5;//inner()的作用域链是inner---全局,所以这个a相当于无效
                var b = 6;//inner()的作用域链是inner---全局,所以这个a相当于无效                inner(7);
            }
            outter(999);//这个999无效,里面的e根本找不到
        </script>
実行環境

実行コンテキスト(実行コンテキスト)、実行コンテキストとも呼ばれます。各実行環境には、関数にアクセスできるすべての変数とデータ (つまり、関数のスコープ チェーン上のすべてのデータと変数) を保存する変数オブジェクト (変数
    オブジェクト
  • ) があります。私たちのコードはアクセスできません。エンジンによって使用されます。

    実行環境スタック。実行が関数に入ると、関数の実行環境がスタックにプッシュされます。関数が実行されると、スタックはその実行環境を削除し、その内部の変数とデータがマークされてクリアされ、ガベージ コレクションを待ってから、制御を前の実行環境に戻します。 JavaScript プログラムの実行は、このメカニズムによって制御されます。
  • 現在の実行環境 (現在のスコープ チェーンにデータと変数を格納する) が変数を見つけられない場合、それは変数が見つからないことを意味し、変数が見つからないことに注意してください。 go to 前の実行環境の検索はスコープチェーンとは異なります

    ;
コードの実行順序は、すべてが行ごとに実行されるわけではなく、関数の呼び出し順序に関連しています:

コードは、グローバル実行環境、グローバル実行環境は環境スタックに置かれます

関数が実行されると、この関数の実行環境が環境スタックの先頭にプッシュされ、その後に前の実行環境が続きます。

グローバル実行環境は最初に入力されるため、常に最下位にあります。これはスタックの概念に似ています。

関数が実行された後、その実行環境はスコープ チェーンの最上位から削除されます。 、保存されたデータと関数はマークされてクリアされ、ガベージのリサイクルを待ちます
  • 制御は前の実行環境に渡され、実行が続行されます
  • ページが閉じられると、グローバル実行環境は破棄されました。
  • コードの実行はグローバル実行環境に入り、グローバルに実行されます。
  • 2 行目を実行し、3 行目に b=2 を割り当てます。 4 行目に c=3; 次に 5 行目に d=4 を代入します;
  • 20 行目を実行し、outer(999) 関数を呼び出し、outer(999) 関数実行環境に入り、昇格を宣言し、実パラメータ 999 を仮パラメータ e に渡します。環境内には 2 つの実行環境があります。 stack、outer (999) は現在の実行環境です。

  • は 16 行目を実行し、次に 17 行目に b=6 を割り当てます。次に、内部 (7) 関数実行環境に入り、プロモーションを宣言し、実パラメータ 7 を仮パラメータ d に渡します。

  • 7 行目を実行し、c=8 を割り当てて、

  • コードの最適化を実行します。

    スコープチェーン上の変数を見つけるにはパフォーマンスが消費されるため、関数が複数のレイヤーにネストされている場合は、関数内で可能な限りローカル変数を使用する必要があります。これはクロススコープ操作であると言えます。関数内でクロススコープ値が複数回使用される場合、それをローカル変数に保存することでパフォーマンスを向上させることができます。

以上がJavaScript スコープチェーンと実行環境の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。