home강의 홈으로
Section 12. 스코프와 바인딩
Lesson 1. 렉시컬과 클로저

I. 렉시컬(정적) 스코프 lexical(static) scope

  • 변수나 상수가 코드상 어디에서 지정되었는가에 따라 그 사용 범위를 결정
  • 함수가 코드상 어디에서 정의되었는가에 따라 그 상위 스코프를 결정
  • 호출한 곳을 기준으로 하는 동적 스코프 dynamic scope 와 상반되는 개념
  • 👉 MDN 문서 보기

const x = 1; const y = 1; const z = 1; function func1 () { const y = 2; const z = 2; console.log('2', x, y, z); func2(); } function func2 () { const z = 3; console.log('3', x, y, z); } console.log('1', x, y, z) func1();
  • func2호출한 블록에서의 y 값은 2
  • func2정의된 블록에서의 y 값은 1
  • 정의된 블록을 기준으로 상위 스코프의 값이 사용됨

💡 func2func1 안으로 옮기면

const x = 1; const y = 1; const z = 1; function func1 () { const y = 2; const z = 2; function func2 () { const z = 3; console.log('3', x, y, z); } console.log('2', x, y, z); func2(); } console.log('1', x, y, z) func1();



II. 렉시컬 환경 lexical environment

  • 전체 문서, 함수, 블록을 실행하기 전 만들어지는 내부 객체
  • 각 스코프의 고유 값들과 외부 스코프에 대한 참조를 포함

구성요소

  • 환경 레코드 environment record - 해당 스코프의 데이터들
  • 외부 렉시컬 환경에 대한 참조 outer lexical environment reference

const x = 1; const y = 1; const z = 1; function func1 (a) { const y = 2; const z = 2; function func2 (b) { const z = 3; console.log('3', x, y, z, b); } console.log('2', x, y, z, a); func2(a + 1); } console.log('1', x, y, z) func1(1);

img





III. 클로저 closure

  • 내부 함수에서 외부 함수의 값에 접근할 수 있다는 개념 함수 중첩시
  • 👉 MDN 문서 보기


function func1 () { const word = 'Hello'; function func2 () { console.log(word); } return func2; } const logHello = func1(); logHello();
  • logHello에는 func1 안의 함수인 func2가 반환되어 지정됨
  • func1실행이 끝났음에도 불구하고, 해당 스코프 내의 값이 살아 있음
  • func2func2가 선언된 환경(func1의 스코프)의 조합 - 클로저


function createCounter (start) { let num = start; return function () { console.log(++start); return start; } } const count = createCounter(10); count(); // ⭐ 반복 실행해 볼 것
  • 단지 값을 복사해서 갖는 것이 아니라, 해당 값이 저장되는 외부 환경 자체가 유지됨


⭐️ private field 흉내내기

function employeeCreator (name, age) { let _name = name; let _age = age; return { name: () => _name, age: () => _age, setAge: function (age) { _age = age; }, getOlder: function (years) { _age += years; } } } const employee = employeeCreator('홍길동', 20); console.log(employee); console.log(employee.name(), employee.age()); employee.setAge(25); console.log(employee.name(), employee.age()); employee.getOlder(3); console.log(employee.name(), employee.age());

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

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

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

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

🛑질문 전 필독!!

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