본문 바로가기

JavaScript

arrow function

더 짧은 함수와 바인딩 되지않은 this.

자바스크립트는 함수의 인자로 함수를 넣을 수 있고, 반환값으로 함수를 사용할 수 있다. 이때 arrow 함수를 사용하면 코드가 보기가 좀더 낫다.

또한 화살표 함수에는 this가 없다. 화살표 함수를 포함하는 객체 값이 사용된다. arrow function은 자신을 포함하는 외부 scope에서 this를 계승받는다.

 

arrow function 사용법

// 기존 function 
var multiply= function(x){
    return x*2;
}

// arrow function 
const multiply = (x) => {
    return x*2;
}

// 매개변수가 1개인 경우 소괄호 생략 가능
const multiply = x => {return x*2}

// 함수가 한줄로 표현가능하면 중괄호 생략 가능하고, 자동으로 return됨
const multiply = x => x * 2

// 매개변수가 두 개 이상일 때
const sum = (x,y) => x + y

// 매개변수가 없을 때
const sum = () => { ... }
 
//return 바로할땐 소괄호 사용
const Immediately = () => ({a:1})

 

this

arrow function은 자신만의 this를 생성하지 않는다. (Lexical this)

// setInterval에 전달 된 함수 내의 this 값은 화살표 함수를 둘러싼 함수의 this와 같은 값을 갖는다.
function Person() {
  this.age = 0;

  setInterval(() => {
    this.age++; // |this| properly refers to the person object
  }, 1000);
}

var p = new Person();
function LexicalThis(lexical) {
  this.lexical = lexical;
}

// Es5
LexicalThis.prototype.lexicalThisWindow = function (arr) {
  console.log(this.lexical);// 'A'
  return arr.map(function (x) {
    return this.prefix + ' ' + x; // 여기서 this.prefix는 undefined. 여기서 this는 window객체다.
  });
};

// Es6 arrow function
LexicalThis.prototype.lexicalThis = function (arr) {
  return arr.map(x => `${this.lexical}  ${x}`); // arrow function에서는 내부 함수여도 this가 arrow function이 선언된 곳에서 상위의 context를 가리키므로 LexicalThis객체 lexcial를 가리키므로 this.lexcial가 A를 가리켜 개발자가 예상한대로 작동한다.
};

var lexWindow = new LexicalThis('A');
var lex = new LexicalThis('A');
console.log(lex.lexicalThis(['Kim', 'Jye']));

this 주의사항

1. 객체의 메소드를 정의할 때는 사용하면 안된다.

2. arrow function을 생성자 함수로 사용할 수 없음.
3. addEventListener 함수의 콜백 함수에서 사용하면 this가 상위 컨텍스트를 가리킴

const obj = {
  name : 'KimJye',
  sayName : () => {console.log(this.name);}
};
obj.sayName()
// 객체의 this를 바인딩하지 않고 전역 객체가 바인딩된다.

 

매개변수에 default 값 적용 가능

const f = (msg ='default args') => {
    alert(msg);
}
f(); // 'default args'

 

arguments 대신 args 사용

// ES5
var foo = function(){
    console.log(arguments);
}
foo(1,2); // { '0':1, '1':2 }

function sum(){
  var arr = Array.prototype.slice.call(arguments);
  return arr.reduce(function(pre, cur){
    return pre + cur;
  });
}
console.log(sum(1,2,3,4));
 
// ES6
var foo1 = (...args) => {
	console.log(args);
}

const sum1 = (...args) => {
  return args.reduce((pre, cur) => pre + cur);
}
console.log(sum1(1,2,3,4));

 

 

Reference 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%ED%95%A8%EC%88%98

https://jeong-pro.tistory.com/110 

 

'JavaScript' 카테고리의 다른 글

CallBack Function  (0) 2019.08.22
구조분해할당  (0) 2019.08.19
setTimeout(), Promise, async/await 비교  (0) 2019.07.29
클로저  (0) 2019.07.24
JSON  (0) 2019.07.23