자바스크립트

Section 12. 자바스크립트 this의 정적 바인딩

포칼이 2023. 4. 7. 18:18

객체의 메서드 종류별 비교

const obj = {
  // function 선언 함수
  func1: function () { return true; },

  // 메서드
  func2 () { return true; },

  // 화살표 함수
  func3: () => true
}

console.log(
  obj.func1(),
  obj.func2(),
  obj.func3()
); //true true true

로그로 출력된 형태를 비교하면 다음과 같다

console.log(obj.func1); //ƒ () { return true; }
console.log(obj.func2); //ƒ func2 () { return true; }
console.log(obj.func3); //() => true

생성자 역할 수행 여부

const func1 = new obj.func1(); //생성된다
const func2 = new obj.func2(); //애러
const func3 = new obj.func3(); //애러

function 선언 함수만 생성자로 활용 가능한 것을 볼 수 있다.

기본적으로 function 함수가 더 많은 기능이 있고 무겁다는 의미가 된다.

 

ES6 함수 구분

화살표 함수와 this

  • function 함수나 메서드의 동적 바인딩과 다르게 동작한다.
  • 함수가 어디서 선언되었는가에 따른다. - 가장 근접한 상위 스코프에 바인딩 고정이다.
  • this를 정적으로 바인딩한다.

1. 객체 리터럴에서

const obj = {
  x: 1,
  y: 2,

  func1: function () {
    console.log('1.', this);
  },
  func2 () {
    console.log('2.', this);
  },
  func3: () => {
    console.log('3.', this);
  }
}
// this가 해당 객체를 가리킴
obj.func1(); //{x: 1, y: 2, func1: ƒ, func2: ƒ, func3: ƒ}
obj.func2(); //{x: 1, y: 2, func1: ƒ, func2: ƒ, func3: ƒ}

// 💡 this가 상위 스코프를 가리킴
obj.func3(); //Window 객체

2. 생성자 함수와 클래스에서

  • 기본적으로는 가리키는 대상이 동일 하다. (해당 인스턴스)
function Korean () {
  this.favorite = '김치';

  this.makeStew = function (isHot) {
    return `${isHot ? '매운' : '순한'} ${this.favorite}찌개`;
  };
  this.fryRice = (isHot) => {
    return `${isHot ? '매운' : '순한'} ${this.favorite}볶음밥`;
  };
}

function Italian () {
  this.favorite = '피자';
}

const korean = new Korean();
const italian = new Italian();

console.log(korean.makeStew(true)); //매운 김치찌개
console.log(korean.fryRice(true)); //매운 김치볶음밥
italian.makeStew = korean.makeStew;
italian.fryRice = korean.fryRice;

console.log(italian.makeStew(false)); //순한 피자찌개
console.log(italian.fryRice(false)); //순한 김치볶음밥

찌개는 function 선언 함수와 메서드로 선언했고 볶음밥은 화살표 함수로 선언했다.

동적으로 바인딩 했을때 function 함수와 화살표 함수의 동작 방식이 다른 것을 볼 수 있다.

 

call, apply, bind, this 인자가 무시된다.

console.log(
  korean.fryRice.call({favorite: '된장'}, true)
); //매운 김치볶음밥

console.log(
  korean.fryRice.apply({favorite: '된장'}, [true])
); //매운 김치볶음밥

console.log(
  korean.fryRice.bind({favorite: '된장'}, true)()
); //매운 김치볶음밥