업데이트:

VUE와 ES6

ES6는 ECMAScript 2015와 같은 의미로, ECMAScript의 6번째 주 버전을 발표한 것.

let과 const

let

  • let는 호이스팅(hoisting) 문제 해결
  • 지역스코프와 전역스코프를 분리하여 서로의 스코프를 침범하지 않음.
//호이스팅
console.log(a); //결과 : undefined
var a = 10;

console.log(b); //결과 : Uncaught ReferenceError: b is not defined
let b = 10;

========================================================================

//스코프1 : 중복선언 방지
var a = 10;
var a = 20;
console.log(a); //결과 : 20

let a = 10;
let a = 20;
console.log(a); //결과 : Uncaught SyntaxError: Identifier 'a' has already been declared

========================================================================

//스코프2 : 값의 보장
var a = 10;
{
    var a = 20;
    console.log(a); //결과 : 20
}
console.log(a); //결과 : 20

let a = 10;
(function(){
    let a = 20;
    console.log(a);
})(); //결과 : 20

console.log(a); //결과 : 10

*호이스팅(hoisting)이란, 변수나 함수가 선언되기 전에 미리 최상위에 끌어올려져 해당 변수명이 등록만 되어있는 상태로 값을 출력하려고 할때 undefined 를 출력함.
* undefined 는 변수는 존재지만 값이 대입되지 않은 상태를 의미.

const

const는 상수를 정의할 때 사용하는 것으로, 불변하는 값을 선언하기 위한 키워드.

  • 반드시 초기화 되어야 함.
  • 대입을 다시하려고 할 때 오류발생
  • 상수값이 객체 또는 배열일 경우 프로퍼티 수정가능.
const a;
a = 10;
console.log(a); //결과 : Missing initializer in const declaration
object  array타입의 변수일 경우,  할당 가능.
const a = {};
const c = [];
a.b = 10;
c.push(30);
console.log(a.b); //10
console.log(c); //[30]

scope 와 closure

scope

var로 선언된 변수의 유효범위는 함수단위로 구분되어 짐.

var num = 10;
function result() {
  var num = 20; //같은 변수명을 함수내부에 선언했을 때 result안에서만 유효.
  console.log(num);
}
result(); //결과 : 20
console.log(num); //결과 : 10

let과 const의 유효범위는 {}단위로 구분되어 짐.

//var
var i = 10;
for (var i = 0; i <= 5; i++) {
  console.log(i); //0 1 2 3 4 5
}
console.log(i); //6

//let
let i = 10;
for (let i = 0; i <= 5; i++) {
  console.log(i); //0 1 2 3 4 5
}
console.log(i); //10

//const
const num = 10;
const result = () => {
  const num = 20;
  console.log(num); //결과 : 20, 같은 이름으로 상수생성이 가능.
};
console.log(num); //결과 : 10

Arrow 함수

함수의 축약법으로 일반함수(function)와 차이가 있음.

  • this 값이 함수를 정의할 때 결정
  • arguments 변수가 없음.
  • 생성자로 사용할 수 없음. (new 키워드 X)
  • yield 키워드 사용할 수 없음.

Arrow 함수 표현식

//일반함수
var square = function(x) {
  return x * x;
};
//arrow함수[인자1개]
var square = x => {
  return x * x;
};
//arrow함수[여러개의 인자]
var square = (x, y, z) => {
  return x * y * z;
};

Arrow 함수 작성방법

  • 인수가 한 개이면, 괄호 생략가능(인수가 없으면 괄호생략 불가)
var square = x => {
  return x * x;
};
  • 몸통 안에 return뿐이면 중괄호와 return 키워드 생략가능.
var square = x => x * x;
  • return 뿐이라도 반환값이 객체리터럴이면 ()로 묶어야 함.
var square = x => ({ x: a, y: b });
  • 즉시실행함수(IIFE)
(x => x * x)(3);

객체 리터럴

기존 객체 정의 방식에서 간결하게 표현할 수 있도록 개선됨.

//속성 축약법
import swiper from "./swiper";
var interaction = {
  //swiper : swiper
  swiper, //속성의 이름을 동일하게 유지할 경우 한번만 정의하면 됨.
  slider: swiper //와 같이 서로 다르게 명명하고자 할 경우는 모두 선언해야함.
};

//메서드 축약법
var obj = {
  // message : function(){
  //     return 'hello';
  // }
  message() {
    //와 같이 선언가능.
    return "hello";
  }
};

스프레드 오퍼레이터

객체와 배열의 병합.

//객체
var obj = {
  a: 10,
  b: 20
};
var obj2 = {
  a: 20,
  c: 30
};
obj2 = { ...obj, ...obj2 }; //간단하게 객체를 복제&병합함.
console.log(obj2); //결과 : {a: 20, b: 20, c: 30}

//배열
var arr = [1, 2, 3];
var arr2 = [3, 4, 5];
arr2 = [...arr, ...arr2];
console.log(arr2); //결과 : [1, 2, 3, 3, 4, 5]

나머지 매개변수
* 기존 arguments는 유사배열로 배열형태 변환을 한번 거쳐야 함.

function f(a, b, ...args) {
  console.log(a, b, args); //1 2 [3 4 5 6]
  //여기서 args는 배열타입
}
f(1, 2, 3, 4, 5, 6);

템플릿 리터럴

변수에 문자열을 여러줄로 작성 : `(백틱)

var str = `
안녕하세요! 
         백틱으로 문자열을 정의해볼께요.
`;
console.log(str); //결과 :
//안녕하세요!
//         백틱으로 문자열을 정의해볼께요.

문자열안에 변수 및 계산식사용.

var msg = "hello~";
var str = `${msg} world!!`;
console.log(str); //결과 : hello~ world!!
var msg = "hello~";
var str = `${msg.split("")} world!!`;
console.log(str); //결과 : h,e,l,l,o,~ world!!

디스트럭처링

일명 구조분해문법이라 하며 객체와 배열에 사용.

//객체
var obj = {
  a: 10,
  b: 20,
  c: 30
};
var { a, b, c } = obj; //같은 유형의 객체형태로 한번에 값 할당이 가능.
console.log(a, b, c); //결과 : 10 20 30

//배열
var arr = ["apple", "banana"];
var [fruit1, fruit2] = arr;
console.log(fruit1, fruit2); //결과 : apple banana
//인수의 구조분해
var obj = {
  a: 10,
  b: 20,
  c: 30
};
function test({ b }) {
  //특정 속성을 골라 인자로 받으면 함수내부에 정의한 듯이 사용가능.
  console.log(a); //결과 : Uncaught ReferenceError: a is not defined
  console.log(obj.a); //결과 : 10
  console.log(b); //결과 : 20
}
test(obj);

import & export

기존의 자바스크립트에 모든 것을 공유하는 방식은 더 복잡해지고 대규모 애플리케이션에서는 충돌과 보안상의 어려움이 있었음.
이것을 해결하기 위해 모듈을 도입하여 모듈 내에 만들어진 변수들은 모듈의 최상위에만 존재, 외부에서 사용하기 위해서는 모듈에서
export 해야됨.

  • 모듈의 최상위에서 this값은 undefined임.
  • 모듈 코드내에서 HTML스타일의 주석을 허용하지 않음.

import

  • 한개 또는 여러개의 바인딩 임포트 가능.
  • 전체를 임포트 할 수 있음.
import {* as example} from 'path';
  • import 때 이름 재정의 가능.
import { add as sum } from "path";
  • export와 import 선언은 모듈의 최상위 수준에서 선언가능.

export

  • export 되는 함수나 클래스는 이름이 필요.
    (export default 로 선언되면 익명함수나 클래스 선언가능.)
  • 새로운 이름을 명시할 수 있음.
//import할 때 export add == import add 이름이 같아야 함.
export { sum as add };
import { add } from "path";

모듈 기본값(default)

  • 모듈마다 하나의 익스포트 기본값을 설정할 수 있음. (여러개의 익스포트 기본값을 설정할 때 에러발생)
  • 기본값을 import할 때는 중괄호({})가 필요없음.
import example from "path";
  • 기본값으로 지정된 바인딩과 아닌 바인딩을 동시에 명시할 수 있음. (단, 기본값이 먼저 선언되어야 함.)
import example, {sum, multiply} from 'path'
      --------- ---------------
        기본값      기본값X

기타사용법

  • 바인딩된 모듈을 다시 익스포트 하기
//기존 문법
import {sum} from 'path'
export {sum}
        ==
export {sum} from 'path'
        or
export {sum as add} from 'path' //sum으로 import되고 add로 익스포트 됨.
export * from 'path' //다른 모듈에 모두 익스포트하고 싶다면

this

실행환경을 소유한 소유자의 객체에 this를 바인딩함. ###일반함수의 this

function outer() {
  console.log(this); //window
}
outer();

중첩함수의 this

function outer() {
  function inner() {
    console.log(this); //window
  }
  inner();
}
outer();

메서드의 this

function outer() {
  console.log(this); //outer
}
var out = new outer(); //인스턴스의 this는 생성자 outer가 됨.

메서드 내부 중첩 함수의 this

function outer() {
  console.log(this); //outer
  function inner() {
    console.log(this); //window
  }
  inner();
}
var out = new outer(); //인스턴스의 this는 생성자,
//중첩함수는 인스턴스로 인한 호출이 아니므로 이곳의 this는 window

Object 내부 함수의 this

var obj = {
  outer: function() {
    console.log(this); //obj
  }
};
obj.outer(); //무엇의 의해 호출되었을 때의 this는 호출한 객체가 됨.

Object 내부 중첩함수의 this

var obj = {
  outer: function() {
    console.log(this); //outer
    function inner() {
      console.log(this); //window
    }
    inner();
  }
};
obj.outer(); //obj
//inner함수는 객체의 의해 호출된 것이 아니므로 this가 window임.

이벤트 리스너의 this

var btn = document.querySelector("button");
btn.addEventListener(
  "click",
  function() {
    console.log(this); //btn
    //객체의 의한 호출이므로 여기서의 this는 btn임.
  },
  false
);

arrow함수의 this

arrow함수는 부모가 바라보는 this를 따라감.

일반함수의 this

var outer = () => {
  console.log(this); //window
  //최상위 함수의 this는 window임.
};
outer();

중첩함수의 this

var outer = () => {
  console.log(this); //window
  var inner = () => {
    console.log(this); //window
    //부모 outer가 window이기 때문에 inner도 window임.
  };
  inner();
};
outer();

메서드 내부 중첩 함수의 this

function outer() {
  console.log(this); //outer
  var inner = () => {
    console.log(this); //outer
    //생성자 함수로 인한 선언은 생성자가 됨.
    //즉, inner arrow함수의 this도 생성자 outer가 됨.
  };
  inner();
}
var out = new outer();

Object 내부 함수의 this

var obj = {
  outer: () => {
    console.log(this); //window
    //잘 기억해보세요. arrow함수는 부모의 this를 따라가요!
    //arrow함수가 따라갈 부모가 없으므로 this는 window가 됨.
  }
};
obj.outer();

Object 내부 중첩함수의 this

var obj = {
  outer: () => {
    console.log(this); //window
    var inner = () => {
      console.log(this); //window
      //부모가 window이므로 내부함수의 this도 window임.
    };
    inner();
  }
};
obj.outer();

이벤트 리스너의 this1

var btn = document.querySelector("button");
btn.addEventListener(
  "click",
  () => {
    console.log(this); //window
    //일반함수 였다면 호출한 객체가 this값이 었겠지만
    //arrow함수는 무조건 부모를 따라감.
  },
  false
);

이벤트 리스너의 this2

var obj = {
  outer: function() {
    console.log(this); //객체내부 일반함수의 this는 객체.
    var btn = document.querySelector("button");
    btn.addEventListener(
      "click",
      () => {
        console.log(this); //객체 obj
        //객체내부로 이벤트리스너가 들어왔을때
        //부모를 따라 this가 obj가 됨.
      },
      false
    );
  }
};
obj.outer();
  • async & await (ECMA2017) 비동기 반복문에 사용
(async()=>{
    const promises = ['1000','2000','3000'].map((timer)=>(
        new Promise((res, rej) = > {
            setTimeout(()=>res(timer), timer);
        })
    ));
    for await (const result of promises){
        console.log(result);
    }
})();

* async와 for of문으로 보여주는 사용 예

댓글남기기