この使い方について


JavaScriptで関数を実行するか、ES 6を作成した後に表示されるブロック({})は실행 컨텍스트を生成し、実行コンテキストには1.Variable Enviroment2.Lexical Enviroment3.thisBindingの情報が含まれます.

1. Varialbe Enviroment

Variable Enviromentはオブジェクトであり、2つの初期状態snap-shotを含み、初期メキシコ環境状態を格納する.関数の実行時、スクリプトの実行時にPropertyとしてLexicalEnvironmentに格納されている値が変化する場合があります.そのため、初期状態を保存して変化を検出する必要がある場合があります.

2. Lexical Enviroment

Lexical Enviromentには、環境記録オブジェクトおよび外部環境参照に関する情報が格納されている.環境レコードには、その範囲内で宣言された識別子に関する情報が格納されます.これらの識別子に関する情報を取得するために、JavaScriptエンジンは、호이스팅の概念を使用して、これらのタグを上から下まで1つずつ読み取り、宣言された識別子および関数を環境記録オブジェクトのpropertyとして格納する(ここで指定された値はまだ保存されていない).
外部環境リファレンスは、現在の関数がどこで実行されているか、スクリプトがどこから作成されているかに関する情報を格納します.ネストされたオブジェクトであるか、関数で実行している関数が親プロセスにアクセスできるとします.これは、現在のステータスが外部環境参照に格納されているためです.

3. thisBinding


この章で検証するthisの使用方法に関する情報と、現在thisが何を指しているかを格納します.もしそうであれば,thisを生成した場合の状況をより容易に理解できる.

関数の実行方法


1.一般的な関数として実行

function func() {
  console.log(this);
  return ;
}
func(); // window
任意の関数として宣言されたfuncがある場合、func()によって関数が実行されると、その関数自体には何もありません.上で1つの関数を実行すると、実行コンテキストの作成時に複数の値が保存されますが、この関数を実行するだけであれば、thisの値はグローバルオブジェクトを参照します(window).

2.メソッドで実行


メソッドは、객체명.함수명として.に接続されたオブジェクト内の関数を呼び出すことです.
const obj = {
  func() {
    console.log(this);
    return ;
  },
  sub: {
    subFunc() {
      console.log(this);
      return ;
    }
  }
}
obj.func(); // (1) obj
obj.sub.subFunc(); // (2) sub
関数が.で呼び出され、メソッドで呼び出される場合、thisの値は.より前に作成されたオブジェクトを参照します.
上記のコードを調べた結果,(1)の結果はobjオブジェクト,(2)の結果はsubオブジェクトであることが分かった.

3. apply/call/bind

apply/call/bindは、開発者が必要とするオブジェクトとして明示的に指定できる方法です.この値が明示的に指定されているため、この値による混乱を減らすことができます.あるいは、callback関数を使用して関数を渡す場合は、これらの方法を使用してこの値を覚えることができます.

4.new演算子-コンストラクション関数

function Person(name,age) {
  this.name = name,
  this.age = age,
  // return 문이 없음을 유의
}
  
function PersonReturn(name, age) {
  this.name = name,
  this.age = age,
  
  return {
    name: "고릴라",
    age: 13
  }
}
  
const 영희 = new Person("영희", 23); // (1)
const 의섭 = new Person("의섭", 26); // (2)
  
const 고릴라 = new PersonReturn("원숭이", 31);
console.log(고릴라.name); // 고릴라
コンストラクション関数を使用してオブジェクトを作成する場合、この値は新しく作成したインスタンスを指します.つまり(1)のthisは英姫を指し、(2)のthisは義燮を指す.
コンストラクション関数を使用する場合は、return文を記述しないことに注意してください.
コンストラクション関数はthis(デフォルトでは新しく作成されたオブジェクトを参照)を返し、開発者が直接戻り文を作成した場合、thisは戻って無視されない場合があります.thisが無視された場合は、戻りゲートが객체 타입に戻ったときである.return文で원시 타입を返すと、そのreturnは無視されますが、객체 타입を返すとthis自体は無視されますので注意してください.