ES6 함수의 추가 기능

2022. 6. 22. 23:53·JavaScript
728x90
반응형
  • ES6 이전의 모든 함수는 일반 함수로서 호출할 수 있는 것은 물론 생성자 함수로서 호출할 수 있다
ES6 함수의 구분 constructor prototype super arguments
일반 함수 O O X O
메서드 X X O O
화살표 함수 X X X X

 

메서드

ES6 사양에서 메서드는 메서드 축약 표현으로 정의된 함수만을 의미한다

const obj={
  x:1,
  //메서드인 foo와 일반함수인 bar
  foo(){return this.x},
  bar: function(){return this.x}
}
console.log(obj.foo());
console.log(obj.bar());

생성자 함수로서 호출
new obj.foo() -> TypeError
new obj.bar() -> bar {}

생성자 함수로서 호출시 에러가 발생하는 이유는 메서드는 non-constructor이여서 인스턴스 생성이 불가능하고

그에 따라서 prototype 프로퍼티가 없고 생성하지도 않는다

앞장에 [[HomeObject]]라는 개념을 잠깐 다룬적이 있다.

ES6 메서드는 자신을 바인딩한 객체를 가리키는 내부 슬롯[[HomeObject]]를 갖는다

반대로 ES6 메서드가 아닌 함수는 내부슬롯 [[HomeObject]]가 없고 super키워드 사용이 불가능하다

화살표 함수

  • 화살표 함수는 인스턴스를 생성할 수 없는 non-constructor
  • 중복된 매개변수 이름을 선언할 수 없다
  • 화살표 함수는 함수 자체의 this,arguments,super,new.target 바인딩을 갖지 않는다
    -> 스코프 체인을 통해 상위 스코프를 참조함

객체 리터럴을 반환하는경우 소괄호()로 꼭 감싸 줘야한다

const arrow=(a,b)=>({a,b})
arrow(1,2)

()로 감싸지 않으면 {a,b}를 함수 몸체 내의 쉼표 연산자문으로 해석한다

*쉼표 연산자
피 연산자를 왼쪽에서 오른쪽으로 평가하고, 마지막 연산자 값을 반환한다
let x = 1;

x = (x++, x);

console.log(x);
// expected output: 2

x = (2, 3);

console.log(x);
// expected output: 3

this

function으로 콜백

class AddItem{
  constructor(item){
    this.item=item
  }
  add(arr){
    return arr.map(function(i){
      return this.item+i;
      // TypeError : Cannot read property 'item' of undefined
    })
  }
}

const plus=new AddItem('-hi-')
console.log(plus.add(['bye','hello']));

여기서 오류가 발생하는 원인은 this에 있다 -> map 내부에서 this.item이 undefined여서 문제 발생

map메서드가 콜백 함수를 일반 함수로서 호출하기 때문이다

 

화살표함수로 콜백

class AddItem{
  constructor(item){
    this.item=item
  }
  add(arr){
    return arr.map((i)=>{
      return this.item+i;
    })
  }
}

const plus=new AddItem('-hi-')
console.log(plus.add(['bye','hello']));

[ '-hi-bye', '-hi-hello' ]

 

화살표 함수는 함수 자체의 this 바인딩을 갖지 않고 상위 스코프의 this를 그대로 참조한다. 이를 lexical this라고한다

 

화살표 함수로 메서드를 정의

const person={
  name:'hi',
  say: ()=>{console.log(`Say ${this.name}`);}
}
person.say() // Say undefined

super,arguments도 위에서 언급한 것 처럼 상위 스코프를 그대로 참조한다

 

REST 파라미터

  • ...변수 형태로 사용한다
  • REST 뜻처럼 반드시 마지막 파라미터여야한다
function sum(){
  console.log(arguments); //[Arguments] { '0': 1, '1': 2 }
}

sum(1,2)

사용법

function sum(...arr){
  console.log(arr); //[ 1, 2, 3, 4, 5 ]
}

sum(1,2,3,4,5)

 

*매개변수의 기본값은 undefined다.

 

모듈

ES6모듈을 ESM이라고 한다

ESM 파일의 확장자는 mjs를 사용할 것을 권장한다

<script type="module" src="app.mjs"></script>

 

728x90
반응형
저작자표시 (새창열림)

'JavaScript' 카테고리의 다른 글

RegExp  (0) 2022.06.29
배열  (0) 2022.06.28
클래스  (0) 2022.06.19
클로저(Closure)  (0) 2022.06.13
this / 실행 컨텍스트  (0) 2022.06.09
'JavaScript' 카테고리의 다른 글
  • RegExp
  • 배열
  • 클래스
  • 클로저(Closure)
Hun-bot
Hun-bot
IT를 중심으로 다양한 것
  • Hun-bot
    로봇이 만드는 눈사람
    Hun-bot
  • 전체
    오늘
    어제
    • All Article (128)
      • Programmers (6)
        • TIP (1)
        • SQL (2)
        • LV1 (1)
        • LV2 (2)
        • LV3 (0)
      • Baekjoon (31)
        • Bronze (10)
        • Silver (19)
        • Gold (2)
        • Platinum (0)
        • Diamond (0)
      • Leetcode (0)
        • Easy (0)
        • Medium (0)
        • Hard (0)
        • SQL (0)
      • 알고리즘(Algorithm) (42)
      • JavaScript (40)
      • Linux (7)
      • JSP (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      자바스크립트 #연습문제
      JSP #Vscode #톰켓 #Tomcat #Java #Web #jdk
      BaekJoon
      JS #JavaScript #프로그래머스 #알고리즘
      티스토리챌린지
      c++
      알고리즘
      async await #js #문법 #자바스크립트 #비동기
      고득점 Kit
      리눅스 #입문
      JS #프로그래머스 #숫자의표현 #알고리즘
      리눅스
      자바스크립트
      Algorithm
      LeetCode #JS #Javascript #Algorithm
      JS #JavaScript #프로그래머스 #카카오
      오블완
      프로그래머스 #자바스크립트 #JS
      JavaScript #Set #Collection
      JS #정규표현식
      Vue #Vue.js #정리
      프로그래머스
      Python #알고리즘
      JS #javascript #객체 #Object
      백준
      SQL
      알고리즘 #Algorithm
      Javascript
      JS #클래스
      Programmers
    • 최근 댓글

    • hELLO· Designed By정상우.v4.10.3
    Hun-bot
    ES6 함수의 추가 기능
    상단으로

    티스토리툴바

    티스토리툴바