JS Deep Dive | 2021.12.16

invidia·2021년 12월 16일
0

TIL

목록 보기
6/29

13. 스코프

정리

스코프 기본개념

  • 식별자 결정: 변수명을 호출했을 때, 어떠한 변수를 줄지 결정하는 것
  • 스코프: 식별자를 결정할 때, 근거가 되는 범위이다.
  • var의 문제점: 같은 스코프 내에서 중복으로 선언이 가능하다.
    • 에러 처리가 안된다.
    • 변수 값이 변경될 수 있다.
  • 스코프 체인: 스코프가 함수 중첩으로 인해 계층적인 구조를 가지는 것
  • JS 엔진의 변수 검색: 변수 참조된 코드의 스코프에서부터 상위 스코프로 이동하며 변수를 검색한다.

스코프 환경

  • 블록 레벨 스코프: C, Java와 같이 함수 몸체 뿐만이 아닌 코드 블럭(조건문, 반복문) 등에서도 지역 스코프가 생성된다.

    • let, const는 블록 레벨 스코프를 지원한다
  • 함수 레벨 스코프: 함수에서만 생성된다.

    • var 언어는 함수 레벨 스코프만 인정되어 의도치않은 재할당이 일어날 수 있다.
  • 동적 스코프: 함수 호출에 따른 상위 스코프 결정

  • 렉시컬 스코프: 함수 정의에 따른 상위 스코프 결정

    • JS가 채용
  • var의 문제점: 코드 블럭에서 지역 스코프가 존재하지 않아 중복 선언하는 경우가 잦고, 중복 선언에 따른 에러가 발생하지 않는 점

느낀점

  • 프로그래밍 언어의 철학이 무엇을 의미하는지 고민해보았다.
    • 그것은 국가의 법과 유사한 것 같다. 국가철학에 맞게 법을 만들어 사람들을 조화시키는 것처럼 언어철학에 맞게 엔진 동작방식을 결정하여 프로그래밍을 가능케하는 것같다.
  • 자바스크립트의 철학은 멀티 패러다임이라는 말처럼, 일종의 포용정책이 강한 것 같다. 함수형 프로그래밍, 객체지향 프로그래밍 등 여러 개념들을 아우르려 하는 느낌이 난다.
    • 아우르려하는 까닭으로는 웹 동작을 위한 언어였기 때문에 다양한 개발자들이 사용할 것을 염두해두었기 때문인 것 같다.

14. 전역 변수의 문제점

정리

용어 정리

  • 전역 변수

  • 변수 호이스팅 재개념: 선언된 스코프가 실행될 때, 선언된 스코프의 선두로 올려진 것 처럼 동작하는 것.

    • 호이스팅은 스코프 단위로 동작
    • 전역변수만 런타임 이전에 실행되는 것
  • 변수 생명주기: 함수의 몸체가 실행될 때 생성 함수가 종료될 때 소멸

    • 전역 변수는 곧바로 생성되고 실행할 문이 없을 때 소멸된다.
      • 전역 객체와 생명 주기가 일치
  • 전역 객체

전역 변수의 문제점

  1. 암묵적 결합: 어디서나 참조 가능 -> 변경 위험
  2. 긴 생명 주기: 언제나 참조 가능 -> 의도치 않은 재할당
  3. 스코프 체인의 종점에 존재: 가장 늦게 검색됨 -> 속도 느림
  4. 네임스페이스 오염: 다른 파일에도 전역 스코프를 공유 -> 예상치 못한 결과 발생

전역 변수 사용 억제방법

  • 즉시 실행 함수: 모든 코드를 즉시 실행 함수로 감싸는 방법
    • 라이브러리 에서 자주 사용
  • 네임스페이스 객체: 전역에 네임스페이스를 담당할 객체를 생성해 사용
  • 모듈 패턴: 함수 & 변수를 감싸 모듈화
  • ES6 모듈: 파일 자체가 독자적인 모듈 스코프를 제공함

느낀점

  • 전역변수 사용 자제하라는 것은 알았지만, 왜 안되는지를 문제점 4가지로 이해했고 억제방법 또한 배웠다.

15. let, const 키워드와 블록 레벨 스코프

정리

varlet, const
변수 중복 선언허용OO
스코프함수 레벨 스코프블록 레벨 스코프
  • let의 변수 호이스팅: 호이스팅에 의해 선언단계는 먼저 실행되지만, 초기화 단계는 선언문에 도착했을 때 실행된다.

    • 선언 - 초기화 까지의 변수 참조 불가 구간을 일시적 사각지대(Temporal Dead Zone)이라 부른다.
  • const

    • 선언 동시에 초기화
    • 재할당 금지.
  • 일반적으로 const를 사용한다

  • 재할당이 필요한 경우 let을 사용한다. (스코프는 최대한 좁게 생성한다.)

느낀점

  • var의 문제점을 해결하기 위해 let, const가 등장했음을 이해했다.

0개의 댓글