일급 객체와 함수

세나정·2023년 6월 6일
0

JavaScript

목록 보기
5/11
post-thumbnail

⭐ 일급 객체

  • 일급 객체란, 컴퓨터 프로그래밍에서 다른 개체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체, 쉽게 말하면 함수를 값으로도 저장할 수 있고 파라미터로 넣어줄 수도 있고 리턴 값으로도 쓰일 수가 있는 것이 일급 객체

  • 자바스크립트의 함수가 이 일급 객체

  • 일급 객체의 조건 1. 변수에 담을 수 있다. 2. 인자에 전달할 수 있다. 3. 반환값으로 사용할 수 있다.

⭐ 함수 선언문과 함수 표현식의 차이점

  • 첫번째 : 문법적 차이
    -- 함수 선언문 : function 함수이름 () { ... }
    -- 함수 표현식 : const 변수이름 = function () { ... }

  • 두번째 : 자바스크립트 엔진이 언제 함수를 생성하는지
    -- 함수 선언문은 실제 실행 흐름이 선언문에 도달하기 전에 함수를 호출할 수 있음, 호이스팅에 영향을 받음
    -- 함수 표현식은 실제 실행 흐름이 해당 함수에 도달했을 때 함수를 생성, 따라서 실행 흐름이 함수에 도달했을 때부터 해당 함수를 호출할 수 있음 (화살표 함수도 호이스팅 불가)

⭐ 화살표 함수

  • 화살표 함수는 항상 익명함수 따라서 함수를 호출하기 위해서는 함수 표현식으로 써야함 const 함수이름 = () => { ... }

  • 장점으로는 function을 써서 함수를 선언하기 때문에 문법을 단순화 할 수 있음 그렇기 떄문에 콜백함수로 사용할 때 표현이 간결

  • 화살표 함수의 this는 바인딩할 객체가 정적으로 결정되고 그 대상은 언제나 상위 스코프의 this를 가리킴 이를 렉시컬 this라고 함, 일반 함수의 this는 바인딩할 객체가 동적으로 결정

  • 화살표 함수는 new 연산자로 호출할 수 없음 즉, 생성자 함수로 활용 불가 prototype 프로퍼티를 갖고 있지 않기 때문
    -- 화살표 함수의 a.prototype은 undefined가 출력됨

  • 화살표 함수는 arguments(유사 배열) 변수가 전달되지 않음
    -- 화살표 함수는 참조 에러가 발생

⭐ 렉시컬(정적 스코프)

  • 렉시컬 스코프는 어디에 선언하였는지에 따라 결정 함수를 어디서 호출했는지가 아님 자바스크립트는 렉시컬 스코프를 따르므로 함수를 선언한 시점에 상위 스코프가 결정됨

  • 함수를 어디서 선언 했는가에 따라 상위 스코프를 결정? -> 렉시컬 스코프

  • 함수를 어디서 호출 했는가에 따라 상위 스코프를 결정? -> 다이나믹(동적) 스코프

⭐ 고차 함수 (HOF : Higher Order Function)

  • 고차함수는 함수를 값으로 다루는 함수, 2가지 종류가 있음
    -- 함수를 인자로 받아서 실행하는 함수 -> apply
    -- 함수를 만들어 리턴하는 함수 (클로저 함수를 만들어 리턴하는 함수) -> addMaker

⭐ 콜백함수 (Callback function)

  • 자바스크립트는 일급 객체임으로 함수에 파라미터로 함수를 전달할 수 있음
  • 파라미터로 전달되는 함수, 함수의 내부에서 실행되는 함수를 콜백함수라 함

IIFE (Immediately-invoked Function Expression)

  • 즉시 실행함수, 함수 리터럴을 ( )로 감싼 뒤 바로 실행하는 형태가 일반적이고 기명도 가능하고 익명도 가능

  • 일반적인 함수 표현식은 함수를 정의하면서 변수에 함수를 저장하고 실행하는 과정을 거치지만, 즉시 실행 함수는 함수를 정의하자마자 바로 호출

  • 괄호로 감싸는 이유는 자바스크립트가 function () { } 키워드를 사용할 경우 자바스크립트 엔진이 선언문으로 인지하기 때문

  • 괄호를 붙이는 것 외에 연산자를 앞에 붙일 경우에도 즉시 실행

  • 즉시 실행 함수에서 선언된 변수는 외부에서 접근할 수 없음 (이를 통해 모듈화와 변수의 스코프를 보호)

  • var의 반복문 클로저를 해결할 때 IIFE를 사용하기도함
profile
압도적인 인풋을 넣는다면 불가능한 것은 없다. 🔥

0개의 댓글