home강의 홈으로
Section 12. 스코프와 바인딩
Lesson 3. this의 정적 바인딩

객체의 메서드 종류별 비교

const obj = { // function 선언 함수 func1: function () { return true; }, // 메서드 func2 () { return true; }, // 화살표 함수 func3: () => true } console.log( obj.func1(), obj.func2(), obj.func3() );

로그로 출력된 형태 비교

console.log(obj.func1); console.log(obj.func2); console.log(obj.func3);

생성자 역할 수행 여부

const func1 = new obj.func1(); const func2 = new obj.func2(); const func3 = new obj.func3();
  • function 선언 함수만 생성자로 활용 가능 - 더 많은 기능이 있고 무겁다는 의미


ES6 함수 구분

생성자 역할 프로토타입 arguments super
function 선언 함수
메서드
화살표 함수


⭐ 화살표 함수와 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(); obj.func2(); // 💡 this가 상위 스코프를 가리킴 obj.func3();


const outer = { a: true, b: false, func: function () { const inner = { x: 1, y: 2, func1: function () { console.log('1.', this); }, func2 () { console.log('2.', this); }, func3: () => { console.log('3.', this); } } // this가 inner를 가리킴 inner.func1(); inner.func2(); // this가 outer를 가리킴 inner.func3(); } } outer.func();

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

  • 기본적으로는 가리키는 대상이 동일 (해당 인스턴스)

⭐ 동적으로 바인딩하는 타 방식과의 차이 확인

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

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));


// ♻️ 새로고침 후 실행 class Korean { constructor () { this.favorite = '김치'; this.fryRice = (isHot) => { return `${isHot ? '매운' : '순한'} ${this.favorite}볶음밥`; } } makeStew (isHot) { return `${isHot ? '매운' : '순한'} ${this.favorite}찌개`; } } class Italian { constructor () { 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));

💡 call, apply, bindthis 인자 무시됨

console.log( korean.fryRice.call({favorite: '된장'}, true) ); console.log( korean.fryRice.apply({favorite: '된장'}, [true]) ); console.log( korean.fryRice.bind({favorite: '된장'}, true)() );



💡 Node.js 파일 실행시 빈 객체가 출력된 이유

  • Node.js는 각 파일을 모듈 (추후 다룰 것, 기본적으로 객체) 로 만들어 실행
  • 파일 내 모든 코드는 모듈의 메서드 안으로 들어가 실행됨 - 즉 객체 내 함수의 코드가 됨

Node.js 코드파일로 실행해 볼 것

// this가 모듈 객체(현재 비어있음)를 가리킴 console.log('0.', this); function func1 () { // this가 전역 객체를 가리킴 console.log('1.', this); } function func2 () { 'use strict'; // this가 undefined를 가리킴 console.log('2.', this); } const func3 = () => { // 💡 this가 모듈 객체(이 함수의 상위 스코프)를 가리킴 console.log('3.', this); } func1(); func2(); func3();

🤔얄코에게 질문하기질문은 반.드.시 이리로 보내주세요! ( 강의사이트 질문기능 ✖ )

강의에서 이해가 안 되거나 실습상 문제가 있는 부분,
설명이 잘못되었거나 미흡한 부분을 메일로 알려주세요!

답변드린 뒤 필요할 경우 본 페이지에
관련 내용을 추가/수정하도록 하겠습니다.

이메일 주소
yalco@yalco.kr
메일 제목 (반드시 아래 제목을 붙여넣어주세요!)
[질문] 제대로 파는 자바스크립트 (유료 파트) 12-3

🛑질문 전 필독!!

  • 구글링을 먼저 해 주세요. 들어오는 질문의 절반 이상은 구글에 검색해 보면 1분 이내로 답을 찾을 수 있는 내용들입니다.
  • 오류 메시지가 있을 경우 이를 구글에 복붙해서 검색해보면 대부분 짧은 시간 내 해결방법을 찾을 수 있습니다.
  • 강의 페이지에 추가사항 등 놓친 부분이 없는지 확인해주세요. 자주 들어오는 질문은 페이지에 추가사항으로 업데이트됩니다.
  • "유료파트의 강의페이지는 어디 있나요?" - 각 영상의 시작부분 검은 화면마다 해당 챕터의 강의페이지 링크가 있습니다.
  • 질문을 보내주실 때는 문제가 어떻게 발생했고 어떤 상황인지 등을 구체적으로 적어주세요. 스크린샷을 첨부해주시면 더욱 좋습니다.
🌏 Why not change the world?