ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript のスコープチェーンの詳細な例

JavaScript のスコープチェーンの詳細な例

黄舟
黄舟オリジナル
2017-11-01 10:13:331392ブラウズ

レビュースコープ

前のセクションでスコープについて説明しました。これは、変数を検索し、現在実行中のコードの変数へのアクセス権を決定する方法を規定します。 ; また、静的スコープは字句スコープであり、コンパイル段階で決定される変数の参照です(コードの実行順序に関係なく、プログラム定義の位置によって決定されます)。ネストされた方法で解析されます)。

質問

var x=10;
    function run(){
        var name='Joel';
        console.log(x+name);//10Joel  这里做了隐适转换 当有+时有一个为string 那么会当做字符拼接来处理
    }
    run();

上記のコードに示されているように、run 関数を実行すると、run スコープに name 変数が存在しますが、変数 x がレポートされないのはなぜですか?アクセスされましたか?親 関数のスコープ で変数を探すことだと理解している人もいるかもしれませんが、実際、この方法でスコープを理解することには曖昧さがあります (関数の親関数を呼び出していると理解されている場合は、それがわかります)。は明らかに間違っています (次のコード))、前のセクションでは、javascript のスコープは静的スコープである、つまり、 はコード定義の場所ではなくコード定義の場所を考慮する必要があると述べました。呼び出し (字句スコープ);

var x=10;
    function fn(){
        console.log(x);
    }
    function show(f){
        var x=20;
        (function(){
            f()
        }());
    }
    show(fn);//10 并不是20

はスコープを分析することでスコープ チェーン

を導きます スコープ チェーンを理解するための変数分析

var a=10;
    function run(){
        var name='Joel';
        function say(){
            var content='hello';
            console.log(content+name+','+a);
        }
        say();
    }
    run();//helloJoel,10

前の記事から、js スコープにはグローバル スコープがあることが分かりました。

グローバル スコープ: 変数 a と run 関数参照があります。もちろん、他の関数と 属性 もあります (組み込みのものについては説明しません) );

関数のスコープには変数名と関数の参照があります;

関数のスコープには変数の内容があります; コードは console.log(content+name+','+a); に実行されます。まず、say 関数のスコープ内で変数の内容、名前、および a を検索します。見つからない場合は、変数 a が存在する場合は、前のスコープまで検索します。現在のsayスコープで見つからない場合は、runスコープで検索されます。見つからない場合は、「定義されていません」というエラーが報告されます。グローバル スコープは最も外側のスコープです。

say 関数で変数名を定義した後は、変数名が Say 関数内にあるため、name の値は run スコープの値ではなくなります。スコープ。検索は続行しません

<script>
    var a=10;
    function run(){
        var name=&#39;Joel&#39;;
        function say(){
            var content=&#39;hello&#39;,name=&#39; Word&#39;;

            console.log(content+name+&#39;,&#39;+a);
        }
        say();
    }
    run();//hello Word,10
</script>

変数を見つけるこの段階的なプロセスは、識別子解析と呼ばれます。または、変数解析として理解できます。この行を提供するか、この方法で変数を見つけるためのメカニズムを呼びます。スコープ チェーン;

このプロセスを要約しましょう:

最初のステップは、現在のスコープ内で変数を見つけ、存在する場合はそれを取得して停止します。そうでない場合は、前のスコープの検索を続行します。

2 番目のステップは、現在のスコープがグローバル スコープである場合、変数が未定義であることを意味します。それ以外の場合は、続行します。スコープ、つまり関数スコープ) 最初のステップに進みます

それでは、スコープ チェーンとは何でしょうか?

実際、スコープ チェーンは本質的に変数オブジェクトを指すポインターのリンクされたリストです。変数オブジェクトの値を参照するだけで、実際には含まれません。

上記のコードのスコープ チェーン構造は次のようになります。

この記事ではスコープ チェーンを紹介するだけです。次の記事では、変数オブジェクト、アクティブ オブジェクト、スコープ チェーンなどが関与する実行環境について正式に説明し、スコープの作成プロセスに入ります。鎖。

最初に実行環境を記述する必要がある理由は、完全なスコープ チェーンが実行環境で構築されるためです。

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

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