[TIL]Javascriptコンセプト


きょう習った


Javascriptコンセプト


スキャン


  • スコットランド?

  • スコットランド?
    すべてのプログラミング言語の基本概念は、識別子の有効範囲を表す.
    Javascriptでは、他の言語とは異なるscopeの特徴があります.
    変数、関数などの識別子は、宣言された位置によって自分の有効範囲を決定します(他のコードは自分の範囲を参照できます).
    この範囲をスコップリーと呼ぶ.

  • 識別識別子
    var x = 'global';
    
    function foo() {
      var x = 'local';
      console.log(x); // 1번 / local
    }
    
    foo();
    
    console.log(x); // 2번 / global
    上記の例では、同じ変数名を持つ2つの識別子があります.
    1つはグローバル変数で、任意の場所で参照できます.
    1つはfoo関数内部で宣言された変数であるため、関数内部でのみ参照できます.
    名前は同じですが、別の変数です.
    JavaScriptエンジンはコンソールです.log(x)に遭遇した場合、どの変数を識別子決定(identifier resolution)と呼ぶべきかを決定する.

  • ネーミングスペース
    コンセプトがない場合は、プログラム全体に同じ名前の変数しかありません.
    プログラミングでは、このスキャン(有効範囲)の概念により、変数名の競合を防止し、同じ名前の変数を使用できるようにします.

  • ひょうほん
    パーティション説明scope変数グローバルコードの最外領域グローバルscopeグローバル変数領域関数本体内部領域scope領域変数
    変数は自分が宣言した位置によって決まる.
    グローバル宣言の変数にはグローバルスキャンがあり、関数内部で宣言された変数にはゾーンスキャンがあります.
    var x = 'global';
    
    function foo() {
      var x = 'local';
      console.log(x); // 1번 / local
    }
    
    foo();
    
    console.log(x); // 2번 / global
    ここで同様に,関数内部には宣言されたx変数のほかに,同名のグローバル変数も存在する.
    foo関数でxを参照すると、グローバル変数ではなく関数内部で宣言されたx変数が参照されます.
    これをIdentifier Resolutionと呼び、javascriptエンジンはスキャンチェーンを介してこの識別子検索を行うことができます.

  • ひょうじチェーン
    💡 関数には、関数の重ね合わせと呼ばれる関数を定義できます.
    関数で定義されている関数はネストされた関数です.
    このオーバーラップ関数を含む関数を外部関数と呼びます.
    関数はオーバーラップするので、スキャンはオーバーラップしてもよく、スキャンは関数のオーバーラップによって階層構造を構成する.(宇宙チェーン)
    JAvascriptエンジンは、参照変数のコードをスキャンするスキャンから開始します.
    上方向に移動し、識別子検索を行います.したがって、親ミラーが宣言する変数を
    サブ顕微鏡下でも参照できます.

  • かんすうレベルそうさ
    コードブロックではなく関数のみで領域スキャンを生成します.
    💡 ブロックレベルスキャン:すべてのコードブロック(if、for、while...)、および関数ローカルスキャンを生成します.ほとんどの言語でブロックレベルスキャンが生成されます.
    varキーワードとして宣言された変数は、関数コードブロックのみを領域スキャンとして使用します.
    しかし、いくつかの問題があるかもしれません.
    ex)
    var i = 10;
    
    // for 문에서 선언한 i는 전역 변수다.
    		// 이미 선언된 전역 변수 i가 있으므로 중복 선언된다.
    for (var i = 0; i < 5; i++) {
      console.log(i); // 0 1 2 3 4
    }
    
    // 의도치 않게 변수의 값이 변경되었다.
    console.log(i); // 5
    varとして宣言された変数は関数レベルのスキャンに適しているため、文以外でも使用できます.(同じ関数のみ)
    そのため、思わぬ動きが生じる可能性があります.
    だから出てきたのはES 6に導入されたlet,constです.これはブロックレベルスキャンをサポートします.

  • でんしけんびきょう

  • 例)
    var x = 1;
    
    function foo() {
      var x = 10;
      bar();
    }
    
    function bar() {
      console.log(x);
    }
    
    foo(); // ?
    bar(); // ?
    結果値はbar関数の親スキャンが何であるかによって異なります.

  • ダイナミックスキャン
    関数をどこから呼び出すかに基づいて、親スキャンを決定します.
    このようにスケーリングを決定し、上記の例ではbarの位相スケーリングはfoo関数のスケーリングである.

  • でんしけんびきょう
    親スキャンは、どこで定義された関数に基づいて決定されます.静的ソプラノとも呼ばれます.
    関数定義を評価すると、位相スキャンが静的に決定されます.
    JAvascriptはこのスクリプトに従います.
    では、呼び出されたとき、自分の上司のスコフをどうやって知るのでしょうか.
    関数定義を実行して生成された関数オブジェクトは、決定された親スキャンを記憶します.
    したがって、関数をどこから呼び出すかは重要ではなく、関数を定義する場所に基づいて親スキャンを決定します.