JS/Javascript

[Javascript] 화살표 함수(Arrow Function)

ui-o 2023. 2. 25. 16:16
반응형

화살표 함수

  • ES5(ES2015) 에 새로 도입된 함수 작성법, 표현식 함수의 간략한 버전
  • function 키워드 대신 화살표를 사용
  • this 바인딩 주의
  • new 연산자로 인스턴스 생성 불가, new 생성자와 함께 호출 할 수 없음

사용 주의점

주의사항 설명
this를 가지지 않음 메서드로 사용 X, 이벤트 핸들러로 직접 사용 시 주의
arguments 객체 없음 function에서는 사용 가능하던 arguments 사용 불가
생성자 함수로 사용 불가 new ArrowFunction() 

문법

  • 화살표 함수 정의가 한 줄인 경우 {} 와 return 생략 가능
  • 파라미터가 1개인 경우 () 생략 가능
// 기본 문법
(매개변수) => {} 

// 한 줄일때 표현 ({}와 return 생략 가능)
const func = (a) => a+2

// 파라미터(매개변수)가 1개 인 경우 () 생략 가능
const func = a => ()

// 다른 선언 방법
const func = x => y => z => `${x], ${y}, ${z}`
// 일반 함수로 표현하면 아래오 같음
function func(x){
	return function(y){
    	return function(z){
        	return `${x], ${y}, ${z}`
        }
    }
}
func(2)(4)(8)




// (key,value) object 반환 시 소괄호 사용
let get = param => ({sport:'soccer'})

// bool
(매개변수) => {
} bool 표현식 || boolean 값이 거짓을 떄 실행할 문장

화살표 함수와 일반함수의 차이

구분 화살표 함수 일반 함수
this 외부 스코프 상속
- 자신이 this를 가지지 않음 
  자신이 정의 된 외부 스코프의 this를 그대로 사용
- this를 묶는 것이 가능
- property에 화살표 함수를 연결하면 화살표 함수 블록에서
 this가 인스턴스를 참조하지 못함
- 내부 콜백에서 this가 바뀌는 문제를 피하고 싶을때, 화살표 함수를 사용 
호출 방식에 따라 결정

호출된 문맥에 따라 "this"가 바뀜
arguments 사용 불가 사용 가능
생성자 (new) 불가능 가능
메서드 정의에 적합
const box = document.querySelector('.box')

// 일반함수에서 this
box.addEventListener('click', function(){
	this.style.color="red" // box를 가리킴
})
// 화살표 함수에서 this
/*
 - 화살표 함수는 자신만의 this를 가지지 않음
 - 대신 함수가 정의된 시점의 this(상위 스코프의 this) 를 그대로 상속받음
 - 해당 this의 상위스코피는 window(브라우저 전역 객체)
*/
box.addEventListener("click", ()=>{
	this.style.color='red' // this가 Window 객체로 설정되어 property ~~ undefined 에러 발생
})


// 화살표 this의 적절한 활용
/*
- 여기서 addEventListener는 일반함수로 등록되어 this는 box를 가리킴
- setTimeout 함수를 화살표 홤수로 사용하여 외부의 this를 그대로 가져옴 
  (※setTimeout은 비동기적으로 실행되는 함수이기 때문에
   여기서 setTimeout(function(){..} 처럼 일반함수를 사용했다면, this는 window를 가리킴
   
   !" 내부 콜백에서 this가 바뀌는 문제를 피하고 싶을때, 화살표 함수를 사용 "
   
   function()은 this를 "호출하는 방식"에 따라 정함
   - 첫 번째 function()은 addEventListener가 box 기준으로 호출해줌
     → 그래서 this === box
    - 두 번째 function()은 1초 뒤에 setTimeout이 직접 호출
     → 이때 **일반 함수는 전역 객체(window)**를 this로 바꿈
     → 따라서 this === window
   - setTimeout(함수, 시간)은 1초 뒤에 함수만 따로 전역 컨텍스트에서 호출함
   - 이때 일반 함수는 주변 문맥을 기억하지 못하고, 자기만의 this를 다시 설정해버림 → window

  
*/
box.addEventListener("click", function () {
	this.style.color = "red";
	setTimeout(() => { 
		this.style.color = "black"; // 이 this는 상위스코프에 상속되어 box를 가리켜 정상 작동
	}, 1000);
});

 

 

구분 일반함수 화살표 함수
this 결정 방식 호출 시점에 결정됨 정의된 시점의 this를 상속
setTimeout 내부에서 this window (전역 객체) 바깥의 this (예: box)
시간 때문인가요? X 시간보단 호출 방식 때문! O

객체에서 화살표 함수의 this

const obj1 = {
	num: 1,
	test: function () {
		this.num++; // obj1.num을 가리켜 정상 구현
		console.log(this.num);
	}
};

obj1.test(); // 2

const obj2 = {
	num: 1,
	test: ()=> {
		this.num++; // this가 window 객체를 가리켜 오류 발생
		console.log(this.num); 
	}
};
obj2.test(); // NaN

 


화살표 함수에서  arguments

  • arguments 객체는 함수 내부에서 접근할 수 있는배열 객체로 해당 함수에 전달돼 인수의 값을 담고 있음
  • 일반함수에서 arguments는 배열 표기법을 사용하여 해당 인수에 접근 가능
  • 화살표 함수에서 arguments는 스프레드 문법을 활용하여 해당 인수에 접근 가능

 

// 일반함수의 arguments 활용
function test(){
	 console.log(arguments[0])
 }
test(1,2) // => 1

// 화살표 함수의 arguments의 잘못된 사용
const show=()=>{
	const name = arguments[0]
	console.log(`name : ${name}`)
}
show('j','a','b') // 오류 :arguments is not defined 

// 화살표 함수의 arguments 적절한 사용(스프레드 문법 활용)
const show2 = (...args) => {
	const name = args[0]
	console.log(`name : ${name}`)
}
show2('a','b','c') // name:a

 

반응형

'JS > Javascript' 카테고리의 다른 글

[함수] 클로저 함수 (Closure Function)  (0) 2023.02.25
[함수] 중첩함수  (0) 2023.02.25
[함수] 콜백(callback) 함수  (0) 2023.02.25
[Javascript] 변수  (0) 2023.02.04
[Javascript] 함수  (0) 2023.02.04