[JS] execution context 'this'


実行コンテキスト(実行コンテキスト)

function a(){
  let youAreIn = 'A Scope'; 
  b(); 
}
function b(){
  let youAreIn = 'B Scope'; 
  c(); 
}
function c(){
  let youAreIn = 'C Scope'; 
  debugger; 
}
a(); 
// execution context 4개(A, B, C, 글로벌영역)생긴다. 
// b는 a에서 호출됐고, c는 b에서 호출됐고, a는 전역에서 호출됐다. 

  • 簡単に言えば「メモリテーブル」

  • execution contextはblockではなく関数単位で生成されます.

  • 各functionscopeにはメモリテーブルがあります.

  • 実行時に生成されます(関数を呼び出すとexecution contextが作成されます).
  • 呼び出しスタックを順番にプッシュ
  • 関数でない場合、pop
  • はcall stackから返されます.

  • ここに入っている
    -scopeの変数と関数(local、global)
    -伝達パラメータ(arguments)
    -呼び出し元(呼び出し元)
    - this


  • 'this' keyword


    すべての関数scope内で自動的に設定される特殊な識別子.
    execution contextのコンポーネントで、関数の実行時に使用できます.

    5 patterns of binding 'this'


    (暗唱!)

    1 & 2. Global & function invocation



    3.メソッドを呼び出すとき、これは親オブジェクトです。


    関数呼び出しとメソッド呼び出しの違い:メソッドとは、オブジェクトに含まれる関数を指します.
    let obj = {
      foo: function(){console.log(this);}
    }
    obj.foo() // method 호출, {foo: f} obj   
    
    let obj2 = {
      hello: {
        fn: function(){console.log(this);}
      }
    }
    obj2.hello.fn() // {fn: f}, hello만 나온다, 딱 자기 부모만 가져온다 
    
    let obj3 = {
      hello: {
        fn: function(){console.log(this);}
      },
      foo: function(){console.log(this);} 
    }
    obj3.foo();// ojb3다 가져온다, 바로 직계 부모만 가져온다 

    4.Construction mode(新しい演算子によって形成された関数領域のthis):新しく作成されたオブジェクト


    constructor:インスタンスの初期化時に実行されるコンストラクション関数

    これを例として
    newキーワードで作成するのが私たちの通常の構築モデルだという人もいます.
    このときinstanceがあって、その時のthisはvante、instanceになりました.

    5. .call or .apply呼び出し:call、applyの最初のパラメータとして指定されたオブジェクト


    関数の実行方法
    1. foo() // function invocation
    2. window.foo() // method invocation
    3. new foo() // construction mode 
    4. foo.call() 
    5. foo.apply() 

    .call




    .apply


    Math.max(2,3,5,1,10,14) // 14 
    let arr = [10, 3,5,7,1,23] 
    Math.max.apply(null, arr) //23