JAvascriptカーネル集約33#6.機能スキャン、Blockスキャン、およびLexicalScope(関数スキャン、ブロックスキャン、LexicalScope)



Scope

  • チャンス
  • (テーマ組織活動等)範囲
  • をよく観察する
    スキャンとは、現在実行中のコンタクトです.
    簡単に言えば、現在実行されている関数が持つ範囲です.
    (実はサイトごとに人の言うことが違うので、どう言ったらいいか分からないので、そう説明しました.😅)
    次に、JavaScriptでスキャンを区別した場合は、大きく2つに分けることができます.
    グローバルレンジ
    コードはどこにでもあります.
    ゾーンスキャン
    関数コードブロックで作成されたscope関数自体とサブ関数でのみ参照できます.
    var x = 'global';
    
    function foo() {
      var x = 'function';
      console.log(x);
    }
    
    function foo2() {
      console.log(x);
    }
    
    foo();//'function'
    foo2()//'global'
    console.log(x);//'global'
    2つの変数xが共有されていますが、fooはそのブロックスキャンの「function」を
    foo 2は、グローバルスキャンの「global」を
    console.log(x)は、グローバルスキャンの「global」を呼び出します.
    グローバル宣言変数xは、任意の場所で参照できます.ただし、関数fooで宣言される変数xは、関数fooでのみ参照でき、関数外部では参照できません.
    ただしfoo 2では、xは自身のスキャン領域にないため、親領域に入って参照値を検索する.
    すなわち、参照変数の識別子は、宣言された位置に基づいて有効な範囲を提供します.
    見つけます.JavaScriptは、これらの複雑な範囲を指定する理由は、識別子名の競合を防止し、区別するためです.

    1.関数スキャン(function-level scope)


    他の言語はブロックレベルの範囲(block-level scope)に従います.ブロックレベルスキャンは、コードブロック({})内の有効なスキャンを表す.
    ただし、JavaScriptは関数レベルの範囲(function-level scope)に従います.関数レベルスキャンは、関数コードブロック内で宣言された変数が関数コードブロック内でのみ有効であり、関数外部で参照できないことを示します.if、for、whileなどの他のブロックで宣言された変数は、自動的にグローバル変数として参照されます.
    ECMAScript 6のlet、constを追加してブロックレベルスキャンを使用できます!
    ECMAScriptはvarではなくletとconstを使用することをお勧めします.
    var x = 1;
    var y = 15;
    
    function foo() {
      var y = 10;
      
      function foo2(){
      	  console.log(y);
      }
      
      foo2();
      console.log(x);
    }
    
    if(true){
    	var z = 3;
    }
    
    foo();//10, 1
    console.log(z);//3
    console.log(y);//error
  • foo()関数のスキャンにはx変数がないため、親スキャン、すなわちグローバルスキャンが見つかった.また、内部関数であるfoo 2は、最も隣接する親スキャンからナビゲートを開始し、そうでない場合は、y変数を検索するために自分のスキャンにナビゲートします.上のスキャンはfooのスキャンであり、y出力はfooの10であり、グローバルスキャンの15ではない.
  • console.log(z)では、zはブロックスキャンで宣言されていますが、JavaScriptは関数レベルのスキャンルールを守っているため、3が出力されます.
  • の外部でfooブロック内部のスキャンにアクセスできないため、コンソール.log(y)はerrorを返します.
  • 2.ブロックスキャン


    前述したように、javascriptは関数レベルのスキャンに従うが、ECMAScript 6に追加されたlet、constはブロックスキャンを使用することができる.
    const x = 1;
    let y = 15;
    
    function foo() {
      let y = 10;
      
      function foo2(){
      	console.log(y);
      }
      
      foo2();
      console.log(x);
    }
    
    if(true){
        let z = 3;
    }
    
    foo();//10, 1
    console.log(z);//error
    console.log(y);//15
    上記の例と同様ですが、letおよびconstはブロックスキャン規則に従うため、ifブロックで宣言されたzはvarのようにグローバル変数として宣言されず、領域変数としてのみ宣言されます.

    3.LexicalScope(LexicalScope)


    lexical

  • (言語)語彙の
  • let name = 'kim';
    
    function func01() {
      console.log(name);
    }
    
    function func02() {
      let name = 'lee';
      func01();
    }
    
    func02();//name
    最初はfunc 02でnameをleeに再割り当てしたのでconsole.「log(name)はleeでしょう」でも.

    😀関数が「呼び出し」ではなく「宣言」されると、Scopeが作成されます。


    これを語彙範囲(Lexic Scopeping)と呼ぶ.
    関数を最初に宣言すると、関数内部の変数はミラーに最も近い変数を参照し続けます.func 01宣言では,最近の変数nameの値がグローバルスキャンにおけるkimとなる.したがって、func 02がleeに再割り当てされると、func 01が参照する値は変わらない.