console.log(this) // window
const myFunc = function () {
  console.log(this)
}
// 브라우저
myFunc() // window
const myObj = {
  data: 1,
  myFunc() {
    console.log(this) // myObj
    console.log(this.data) // 1
  }
}
myObj.myFunc() // myObj
const myObj = {
  numbers: [1],
  myFunc() {
    console.log(this) // myObj
    this.numbers.forEach(function (num)
 {
      console.log(num) // 1
      console.log(this) // window
    })
  }
}
myObj.myFunc()

화살표 함수는 호출의 위치와 상관없이 상위 스코프를 가리킴(Lexical scope this)

=> 따라서 함수 내의 함수 상황에서 화살표 함수를 쓰는 것을 권장
함수를 호출하는 데 사용되는 메서드
function greet(name) {
    console.log(`Hello, ${name}! I'm ${this.job}.`);
}
const person = {
    name: 'John',
    job: 'developer'
};
greet.call(person, 'Alice'); // 출력: Hello, Alice! I'm developer.
function greet(name) {
    console.log(`Hello, ${name}! I'm ${this.job}.`);
}
const person = {
    name: 'John',
    job: 'developer'
};
greet.apply(person, ['Alice']); // 출력: Hello, Alice! I'm developer.
함수의 this 값을 영구적으로 바인딩한 새로운 함수를 생성
function greet(name) {
    console.log(`Hello, ${name}! I'm ${this.job}.`);
}
const person = {
    name: 'John',
    job: 'developer'
};
const greetPerson = greet.bind(person);
greetPerson('Alice'); // 출력: Hello, Alice! I'm developer.