즉시 실행 함수 (IIFE, Immediately-Invoked Function Expression)

  • 즉시 실행하여야하지만 전역 스코프(Global Scope)를 오염시키지 않으려고 할때 사용한다.
  • 함수 리터럴을 ( )로 감싼 뒤 바로 실행하는 형태가 일반적이며 기명도 가능하고 익명도 가능하다.
  • ( )로 감싸주는 이유는 자바스크립트는 function(){ } 키워드를 사용할 경우 파서가 선언문으로 인지한다.
  • 선언문은 해석기에서 실행 후 사라지기에 값으로 존재하지 않는다. 때문에 "함수 표현식"을 통해 명시적으로 나타내줘야한다.
  • ( )를 붙이는 것 외에도 연산자를 앞에 붙일 경우에도 즉시 실행된다.
-function(a, b){ return console.log(a + b) })(1,2) // 3
// 즉시 실행됨

하지만 보통 ( )로 묶는 표현 방법을 사용한다.

(function(a, b){ return console.log(a + b) })(1,2) // 3
// 즉시 실행됨

;(function(a, b){ return console.log(a + b) })(1,2) // 3
// 즉시 실행되며 앞에 값과 이어진 값으로 평가받는것을 방지할 때 세미콜론을 사용한다.

 

함수 선언문이 아닌 함수 표현식으로 작성해야한다.

const hello = function(){} // (X)

(function(){
    // ..
})(); // (O)

(function(){
    // ..
}()); // (O)

 

단순히 위의 예시는 코드 스타일의 차이이나 화살표함수일 경우 아래 예시처럼 첫번째 방법만 사용이 가능하다.

(() => {
    // ..
})(); // (O)

(() => {
    // ..
}()); // (X)

 

아래와 같이 호출하는 경우 함수 호출을 하기 위한 호출대상이 명세에서 말하는 Member Expression 이어야하나 화살표함수는 Assignment Expression 이기때문에 불가능하다고 한다. 

(화살표 함수의 => 화살표는 연산자가 아닌 것으로 취급되며 화살표 함수 자체의 파싱이 특별하게 취급되기 때문이라고 하는데,  Assignment Expression로 인식되나봄???)

 

참고 ↓↓↓↓

https://stackoverflow.com/questions/34589488/es6-immediately-invoked-arrow-function/34589765#34589765

 

ES6 immediately invoked arrow function

Why does this work in a Node.js console (tested in 4.1.1 and 5.3.0) but doesn't work in the browser (tested in Chrome)? This code block should create and invoke an anonymous function that logs Ok. ...

stackoverflow.com

 

위와 같은 이유로 ( ) 없이 사용하는 ! 연산자또한 즉시실행 함수 표현식에서 문법오류가 발생한다.

((a, b) => a + b)(1, 2); // 3
!(a, b) => a + b)(1, 2); // Uncaught SyntaxError

 


 

출처 및 참고

IIFE (Immediately-Invoked Function Expression)

https://github.com/baeharam/Must-Know-About-Frontend/blob/master/Notes/javascript/iife.md

 

자바스크립트의 IIFE

https://velog.io/@doondoony/javascript-iife

네이티브 객체(NAtive Objects)

 

자바스크립트 언어 규약(ECMAScript)명세의 정의된 내장 객체이다.

  • native object, built-in object라고 부른다.
  • 전역의 공통 기능을 제공하며 특정 환경(브라우저 등의 클라이언트 프로그램, 또는 Node.js 등의 런타임)에 종속되지 않는다.
  • 네이티브 객체는 모든 내장 객체(built-in object)를 포함하며 내장 네이티브 생성자는 각자의 .prototype객체를 가진다.
  • 프로토타입 객체에는 해당 객체의 하위 타입별로 고유한 로직이 담겨있다.

종류

  • String()
  • Number()
  • Boolean()
  • Array()
  • Object()
  • Function()
  • RegExp()
  • Date()
  • Error()
  • Symbol()

생성자 처럼 사용할 수 있지만 아닌 경우도 있다.

new String('Hello'); 
// string 'Hello'가 아닌 'Hello'를 감싸는 문자열 래퍼를 생성함

 

Object를 type으로 가지고 있는 값의 경우 [[Class]]라는 내부 프로퍼티가 추가로 있는데, 이때 이 프로퍼티를 접근하기 위해서는 Object.prototype.toString() 메서드에 값을 넣어 호출해야한다.

Object.prototype.toString.call([1,2,3]); 
// '[object Array]'

원시값의 경우 null과 undefined는 각각 Null, Undefined로 나타난다.

 

그 밖의 

문자열, 숫자, 불리언 등은 단순 원시값이며 자바스크립트는 원시값을 자동으로 객체 래퍼(Wrapper) 클래스로 박싱하여 오류를 방지한다.

var hello = 'Hello';
// 문자열은 원시값

hello.length; // 5
// 이때 length()로 접근하는데, 오류가 발생하지 않는다.

 

Symbol은 ES6에서 처음 선보인 새로운 원시값 타입이다.

충돌 염려없이 객체 프로퍼티로 사용가능한 특별한 '유일 값'이다.

Symbol은 프로퍼티명으로 사용할 수 있으나 프로그램 코드나 개발자 콘솔 창에서 실제 값을 보거나 접근하는 것은 불가능하다. (함수 객체의 정적 프로퍼티로 접근한다.)

Symbol은 네이티브 생성자이기 때문에 new를 붙이면 에러가 난다.

var hello = Symbol('Hello');

typeof hello // "symbol"

Object.getOwnPropertySymbols(hello); // [ Symbol(hello) ]

 

 

호스트 객체(Host Objects)

 

ECMASrcipt의 실행 환경을 만들기위해 window, XMLHTTPRequest 등 런타임환경(브라우저, Nodejs)에 의해 제공되는 객체를 말한다.

 

 

종류 (ex : 브라우저 환경일때)

ㄴ os, web browser를 실행환경에서 제공하는 호스트 객체라고 할 수 있음

  • window (BOM, browser object model)
    • 모든 객체의 유일한 최상위 객체인 전역객체, 브라우저 탭 또는 브라우저 창의 모델
  • document (DOM, document object model)
    • 현재 웹페이지의 모델
  • location
  • history
  • XMLHttpRequest
  • setTimeout
  • getElementsByTagName
  • querySelectorAll, …

참고

네이티브 객체 VS 호스트 객체
네이티브 객체 
호스트 객체와 네이티브 객체
호스트객체와 네이티브객체

 

실행컨텍스트(Execution Context)

  • 코드의 실행환경에 대한 여러가지 정보를 담고 있는 개념 

    • 자바스크립트 엔진에 의해 만들어지고 사용되는 코드 정보를 담은 객체의 집합

  • 글로벌스코프, 함수스코프 등.. 스코프의 코드는각각의 실행 컨텍스트를 생성한다.

    • 글로벌 스코프는 실행 이전에 생성되지만, 함수스코프는 함수 호출 시 생성된다.

    • 글로벌 스코프는 코드를 실행하기 전에 쌓이고 모든 코드를 실행하면 제거된다.

  • 실행 컨텍스트가 생성되면 흔히 콜 스택(Call Stack)이라고도 불리는 실행 컨텍스트 스택에 쌓이게 된다.

 

구성요소

  • 어휘 환경(Lexical Environment)

    • 변수 및 함수 등의 식별자(Identifier) 및 외부 참조에 관한 정보를 가지고 있는 컴포넌트

    • 구성요소

      • Environment Record (식별자에 관한 정보)

      • outer 참조 (외부 Lexical Environment를 참조하는 포인터)

  • 변수 환경(Variable Environment)

    • var 로 선언된 변수만 저장한다.

      • var 로 선언된 변수를 제외하고 나머지(let 으로 선언되었거나 함수 선언문)를 저장

  • this 바인딩

    • this 객체에 어떻게 바인딩이 되는지를 나타낸 것

      • 글로벌스코프

        • 글로벌 객체로 바인딩되며(브라우저 window, 노드 global) strict mode라면 undefined

      • 그 외

        • 함수가 어떻게 호출되었는지에 따라 바인딩

 

과정

  • 생성단계

    • 값이 변수에 매핑되지 않는다

    • 구성

      • Lexical Environment 생성

      • Variable Environment 생성

      • this 바인딩

  • 실행단계

 

 


 

 

취준생이 반드시 알아야 할 프론트엔드 지식들

https://github.com/baeharam/Must-Know-About-Frontend

 

실행컨텍스트(Execution Context)

https://github.com/baeharam/Must-Know-About-Frontend/blob/master/Notes/javascript/execution-context.md

 

ES2018(ES9) 변화

 

Rest, Spread

Rest

  • 선택되지 않은 나머지 속성을 모아준다.
  • 값이면 복사하고 객체는 참조한다.
const { a, ...rest } = { 
	a: 1, b: 2, c: 3 
}; 

console.log(rest); // { b: 2, c: 3}

- 코드 출처 : 제로초님 블로그

 

Spread

  • Object.assign과 비슷하다.
  • 값이면 복사하고 객체는 참조한다.(같은 속성명이라면 덮여씌워진다.)
const obj = { 
	a: 1, b: 2, c: 3 
}; 

const spread = { 
	a: 3, d: 4, ...obj, 
}; 

console.log(spread); // { a: 1, b: 2, c: 3, d: 4 } (a: 3이 덮어씌워짐)

- 코드 출처 : 제로초님 블로그

 

 

Promise.prototype.finally

  • then, catch외에 finally 추가
  • promise 실행 결과에 상관없이(성공 실패 여부 상관 없이) 마지막에 무조건 실행
  • finally 뒤에 then, catch 등을 체이닝 할 수 있음
  • resolve 값은 바꿀 수 없고 reject값만 바꿀 수 있다.

 

for-await-of (Async iteration)

  • 비동기 iterable 객체를 반복하는 구문
  • Async for - of문은 비동기 함수, 비동기 generator 함수 내에서만 사용 가능
  • promisa.all외에도 비동기 반복 처리에 옵션이 하나 더 생김

 

정규표현식

  • lookbehind 생김 - 특정 문자열 뒤의 문자열을 찾는 기능 - 이를 위해 ?>=, ?>! 심볼 추가
  • 캡쳐링 그룹에 네이밍가능
    • 캡쳐링이란? 괄호로 묶어준 것들
    • 기존에는 순서대로 번호가 매겨졌지만 이제 사용자가 네이밍할 수 있음
    • 결과에 groups 속성으로 접근 가능
  • s 플래그 추가되어 .의 기능이 강화
  • u 플래그 추가(특정 유니코드를 정규표현식으로 표현 가능 해짐)
  • \n도 매칭

 


 

ES2018(ES9)의 변화

https://www.zerocho.com/category/ECMAScript/post/5adae68aca91b1001b14dd29

[JS] ECMA2018 : ES9 알아보기

https://a-tothe-z.tistory.com/15

 

+ Recent posts