4 minute read

  • 재귀와 스택

    • 재귀

      • 함수가 필요에 의해 자기 자신을 호출하는 경우

      • 반복과 서로 대체 가능

      • 실행 컨텍스트 사용

      • 베이스 : 명확한 결과값을 즉시 도출하는 코드로 작업을 아주 간단하게 만들어서 함수가 더 이상 서브 호출을 하지 않게 해주는 인수

      • 재귀 단계: 함수가 자기 자신을 호출하는 단계

      • 재귀 깊이 : 처음 호출을 포함한 중첩 호출의 최대 개수

    • 실행 컨텍스트

      • 코드 실행에 대한 세부 정보를 담고 있는 내부 데이터 구조

      • 제어 흐름의 현재 위치, 변수의 현재 값, this 의 값, arguments, return 값 등 실행 환경에 대한 상세 내부 정보 저장

      • 스택 구조로 형성되며 처리됨

      • 함수 호출 1회당 정확히 하나의 실행 컨텍스트 형성되며 메모리 하나씩 차지함

      • 종류

        • 전역 컨텍스트

          • 모든 것을 관리하는 환경

          • 스크립트가 완전히 종료될 떄 까지 남아있음

        • 함수 컨텍스트

          • 함수를 관리하는 환경

          • 함수 실행이 끝났을 시 스택 구조에 의해 삭제됨

    • 재귀적 순회는 재귀로 구현

    • 재귀적 구조는 자기 자신의 일부를 복제하는 형태의 자료 구조

    • 연결 리스트는 객체의 자료 구조 중 하나로 빠르게 삽입, 삭제가 가능하지만 index 같은 기능 지원하지 않음

  • 나머지 매개변수와 전개 문법

    • 나머지 매개 변수

      • 함수 매개변수의 끝에서 사용

      • 인수 목록의 나머지를 배열로 모아줌

      • 항상 마지막에 있어야 함

    • 전개 문법

      • 함수 호출 시 사용

      • 배열을 목록으로 요소를 풀어서 펼쳐주는 작업

      • 이터러블을 목록으로 확장해줌

    • arguments

      • 반복 가능한 유사 배열 객체

      • 인덱스를 사용해 모든 인수에 접근

      • 배열 메서드 사용 불가능

      • 인수 일부만 사용 불가능

      • 화살표 함수는 this 를 가지지 않기 때문에 arguments 를 따로 가지지 않음

  • 변수의 유효범위와 클로저

    • 변수의 유효 범위

      • 변수는 코드 블록 단위로 유효 범위 생성

      • 중첩 함쉬는 함수 내부에 선언한 함수이며 외부 변수에 접근할 수 있음

    • 렉시컬 환경

      • 실행중인 스크립트 전체, 코드 블록, 실행 중인 함수가 가지는 ‘숨김 연관 객체’

      • 환경 레코드, 외부 렉시컬 환경에 대한 참조 가짐

      • 변수값 갱신은 변수가 저장된 해당 환경에서 이뤄짐

      • 환경 레코드

        • 모든 지역 변수를 프로퍼티로 가지고 있는 객체

        • this 같은 기타 정보도 저장

      • 외부 렉시컬 환경에 대한 참조

        • 외부의 렉시컬 환경 레코드를 참조하는 값
      • 변수

        • 변수는 ‘환경 레코드’ 의 프로퍼티

        • 스크립트 시작 시 스크립트 내에서 선언한 변수 전체가 환경 레코드에 올라가지만 실행 흐름이 닿기 전까지 참조 불가능

      • 함수

        • 함수 선언문의 경우 바로 초기화 되고 사용 가능

        • 내부 렉시컬 환경, 외부 렉시컬 환경 참조값 두 개를 실행 시 마다 가지게 됨

        • [[Envifronment]]

          • 함수가 가지는 숨김 프로퍼티

          • 함수가 만들어진 곳의 렉시컬 환경의 참조 값

          • 함수가 생성된 곳을 기억하는 용도

          • 호출 때 마다 새로운 렉시컬 환경을 참조해서 만들어지며 해당 함수는 렉시컬 환경으로써 참조함

          • 함수가 호출될 떄 단 한번 세팅되고 변하지 않음

          • 프로퍼티들은 가비지 컬렉션이 건드리지 않으며 메모리에서 유지됨

      • 클로져

        • 외부 변수를 기억하고 기억한 외부 변수에 접근할 수 있는 함수

        • JS 는 모든 함수가 [[Environment]] 로 외부 렉시컬 환경을 참조하므로 클로져

    • 최적화 프로세스는 JS 엔진마다 다름

  • var

    • let, const 와 다른 특성 보임

    • 동일한 변수명 여러 번 선언 가능

    • 블록 스코프가 아닌 함수 수준 스코프 가짐

    • 호이스팅

      • 스크립트, 함수가 실행될 떄 var, 함수 선언문으로 선언한 값들이 컨텍스트(실행 환경)의 맨 위로 끌어올려져서 선언되는 것

      • 함수 선언문

        • 선언과 할당이 호이스팅되므로 바로 실행 가능
      • var

        • 선언만 호이스팅 되므로 할당은 실행 흐름이 도달하기 전 까지 안 됨
    • 즉시 실행 함수

      • 함수 표현식을 괄호로 만들어서 함수 표현식으로 인식 시키는 방법

      • var 가 함수 수준 스코프를 가지는 것을 이용해 블록 레벨 스코프를 가질 수 있게 하는 방안

      • 함수의 이름 없어도 됨

  • 전역 객체

    • 실행(호스트) 환경이 가지는 객체

    • 언제 어디서나 사용 가능한 변수 만들 때 사용

    • 환경에 따라 전역 객체의 이름과 프로퍼티 달라짐

    • 이름을 globalThis 로 표준화 하자는 내용 JS 명세에 추가 됨.

    • 프로퍼티는 바로 사용 가능

    • var는 바로 프로퍼티화

    • 프로퍼티에 폴리필 추가 가능

  • 객체로서의 함수

    • 함수는 객체

    • 다양한 메서드 존재

    • name 프로퍼티는 컨텍스트 이용해 이름 추론

    • length 프로퍼티는 함수 선언부에 있는 인수의 수(나머지 매개변수는 포함 안 됨)

    • 프로퍼티에 정보 저장해서 클로져 처럼 환경 변수 핸들링 가능

    • 프로퍼티로 함수의 일과 함수의 프로퍼티 기능 둘 다 사용

    • 기명 함수 표현식

      • 함수 표현식으로 함수 정의 후 이름 부여하는 기능

      • 함수 내부에서 정의된 이름 사용

  • new Function

    • 함수 표현식, 함수 선언문 이외에 함수 만들때 대안 없을 때 사용

    • new Funtion 문법으로 생성

    • 생성문의 인자엔 반드시 문자열만 가능

    • 서버에서 전달받은 문자열 사용하여 실행 가능

    • 렉시컬 환경은 전역 환경만 참조

    • ‘압축기’ 에 의해 코드를 줄여 변수명이 교체되기 떄문에 함수 내부에서 외부 변수에 접근 불가능

    • 매개변수 넘겨줄 떄는 함수 호출때 인수로 넘겨주는게 좋음

  • setTimeout 과 setInterval을 이용한 호출 스케쥴링

    • 함수의 규칙적/한번 실행을 일정한 delay 주고 싶을 때 사용

    • 함수 넘길 때 참조값을 받도록 되어 있기 때문에 실행문이 아닌 반환문 만 넘겨야 함

    • 반환값은 타이머 식별자이고 식별자 이용하여 스케쥴링 취소가 사용함

    • alert 창 떠있어도 타이머는 멈추지 않음

    • 인자에 함수 넘길 시 내부 참조가 새롭게 만들어 지므로 가비지 컬렉션 대상 안 됨(메모리 누수 줄여야 할 시 스케쥴링 취소 해야함)

    • delay 가 0 일 시 ‘현재 스크립트 실행 완료 후’ 함수 호출됨

    • 중첩 setTimeout/setInterval 5회 이상 이뤄질 시 지연 간격 4밀리초 이상으로 강제됨

    • 지연 간격 보장은 현재 실행 환경에 따라 달라짐

    • setInterval

      • 일정한 delay 간격 주기로 인자에 넘겨진 함수 실행

      • 함수를 실행하는 데 걸리는 시간도 지연 간격에 포함되기 delay 시간 보장하지 않음

    • setTimeout

      • 일정한 delay 후 인자에 넘겨진 함수 실행

      • 함수 실행하는데 걸리는 시간 지연 간격에 포함하지 않기 떄문에 delay 시간 보장

  • call/apply 와 데코레이터, 포워딩

    • call/apply

      • 함수의 특별 내장 메서드로 컨텍스트 설정 가능

      • call

        • 함수의 this를 할당하여 호출하는 기능
      • apply

        • 함수의 this 할당하고 유사 배열 전달하여 호출하는 기능

        • call 도 여러 인수 넣을 수 있어서 유사하지만 JS엔진에 최적화 됨

    • 포워딩

      • 컨텍스트와 함께 인수 전체를 다른 함수에 전달하는 것

      • call에 여러 인자 넣거나 apply 로 구현

    • 데코레이터

      • 함수를 감싸는 래퍼를 반환해서 함수의 행동을 변화 시키는 함수

      • 주요 작업은 여전히 함수에서 처리 되기 떄문에 재사용 가능하며 원래 함수 복잡성을 증가시키지 않음

      • 코드 변경 없이 캐싱 기능 추가, 디바운스, 스로틀링 같은 상황에서 사용

    • 메서드 빌리기

      • 다른 타입의 객체에서 메서드를 빌려와 사용하는 경우

      • 배열 메서드 빌려서 유사 배열이나 이터러블 객체에 적용할 때 자주 사용

  • 함수 바인딩

    • bind

      • 함수의 this의 context 를 고정할 떄 사용

      • context가 고정된 함수 반환

      • 객체 메서드의 this를 고정해 어딘가에 넘길 떄 사용

      • 인수를 고정하는 데도 사용 가능(partial)

    • partial

      • 기존 함수의 인수 몇 개를 고정한 함수

      • 같은 인수를 여러 번 반복하고 싶지 않을 때 유용

  • 화살표 함수

    • this를 가지지 않아 함수의 컨텍스트 유지 가능

    • arguments 지원하지 않아서 호출 포워딩 해주는 데코레이터 만들 떄 유리

    • new 와 함께 호출 할 수 없음

    • bind 함수는 this를 묶인 상태로 호출 가능한 특수한 객체 만든다는 점에서 this 를 묶지 않는 화살표 함수와 차이 있음

Categories: ,

Updated: