일급 객체란, 컴퓨터 프로그래밍에서 다른 개체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체, 쉽게 말하면 함수를 값으로도 저장할 수 있고 파라미터로 넣어줄 수도 있고 리턴 값으로도 쓰일 수가 있는 것이 일급 객체
자바스크립트의 함수가 이 일급 객체
일급 객체의 조건 1. 변수에 담을 수 있다. 2. 인자에 전달할 수 있다. 3. 반환값으로 사용할 수 있다.
첫번째 : 문법적 차이
-- 함수 선언문 : function 함수이름 () { ... }
-- 함수 표현식 : const 변수이름 = function () { ... }
두번째 : 자바스크립트 엔진이 언제 함수를 생성하는지
-- 함수 선언문은 실제 실행 흐름이 선언문에 도달하기 전에 함수를 호출할 수 있음, 호이스팅에 영향을 받음
-- 함수 표현식은 실제 실행 흐름이 해당 함수에 도달했을 때 함수를 생성, 따라서 실행 흐름이 함수에 도달했을 때부터 해당 함수를 호출할 수 있음 (화살표 함수도 호이스팅 불가)
화살표 함수는 항상 익명함수 따라서 함수를 호출하기 위해서는 함수 표현식으로 써야함 const 함수이름 = () => { ... }
장점으로는 function을 써서 함수를 선언하기 때문에 문법을 단순화 할 수 있음 그렇기 떄문에 콜백함수로 사용할 때 표현이 간결
화살표 함수의 this는 바인딩할 객체가 정적으로 결정되고 그 대상은 언제나 상위 스코프의 this를 가리킴 이를 렉시컬 this라고 함, 일반 함수의 this는 바인딩할 객체가 동적으로 결정
화살표 함수는 new 연산자로 호출할 수 없음 즉, 생성자 함수로 활용 불가 prototype 프로퍼티를 갖고 있지 않기 때문
-- 화살표 함수의 a.prototype은 undefined가 출력됨
화살표 함수는 arguments(유사 배열) 변수가 전달되지 않음
-- 화살표 함수는 참조 에러가 발생
렉시컬 스코프는 어디에 선언하였는지에 따라 결정 함수를 어디서 호출했는지가 아님 자바스크립트는 렉시컬 스코프를 따르므로 함수를 선언한 시점에 상위 스코프가 결정됨
함수를 어디서 선언 했는가에 따라 상위 스코프를 결정? -> 렉시컬 스코프
함수를 어디서 호출 했는가에 따라 상위 스코프를 결정? -> 다이나믹(동적) 스코프
즉시 실행함수, 함수 리터럴을 ( )로 감싼 뒤 바로 실행하는 형태가 일반적이고 기명도 가능하고 익명도 가능
일반적인 함수 표현식은 함수를 정의하면서 변수에 함수를 저장하고 실행하는 과정을 거치지만, 즉시 실행 함수는 함수를 정의하자마자 바로 호출
괄호로 감싸는 이유는 자바스크립트가 function () { } 키워드를 사용할 경우 자바스크립트 엔진이 선언문으로 인지하기 때문
괄호를 붙이는 것 외에 연산자를 앞에 붙일 경우에도 즉시 실행
즉시 실행 함수에서 선언된 변수는 외부에서 접근할 수 없음 (이를 통해 모듈화와 변수의 스코프를 보호)