본문 바로가기
공부일지/Javascript

JavaScript 문법. Arrow Function( 화살표 함수 )

by 곰인간 2023. 1. 29.

* 화살표 함수를 외면하고 일반 함수만 하던 나..

(이전 글들 보면 화살표 함수 예제를 다 일반 함수로 바꿔서 씀..)

* 화살표 함수, 피할수 없다면 즐겨주겠어.


자바스크립트 함수 정의 방법

1. 일반 함수

2. 화살표 함수


1-1. 일반 함수 - 함수 선언식

함수 선언식이란,

함수 function키워드를 쓰고, 함수 이름을 넣어준 다음 함수 블록에 내용을 채워 넣으면 된다.

* 참고 자료 1 : MDN Web Docs - 함수 선언(function declaration)

function name([param[, param,[..., param]]]) { [statements] }

name

함수 이름.

param

함수로 전달되는 인수(argument)의 이름. 인수의 최대 개수는 엔진마다 다름.

statements

함수의 몸통(body)을 구성하는 문(statement).

 

* 참고 자료 2 : 유튜브 별코딩 - 화살표 함수 기본편

function name () {
    console.log("곰인간");
};

name(); // 곰인간

함수 선언식으로 작성된 함수의 특징은

호이스팅이 된다.

name(); // 곰인간

function name () {
    console.log("곰인간");
};

함수 선언식으로 함수를 정의할 때는 함수 이름을 필수적으로 들어가기 때문에

함수 선언식으로는 익명 함수를 만들 수 가 없다.

1-2. 일반 함수 - 함수 표현식

함수 표현식이란,

함수 선언식과 문법적으로 비슷하지만, 함수 표현식 방법으로 정의하면, 익명 함수를 만들 수가 있다.

function 키워드를 사용하지만 선언식과 다르게 함수 이름을 생략 할 수 있다.

* 참고 자료 1 : MDN Web Docs - 함수 선언(function declaration)

  var myFunction = function [name]([param1[, param2[, ..., paramN]]]) { statements };

name

함수 이름. 함수가 이름 없는(anonymous) 함수인 경우, 생략될 수 있음. 이 함수 이름은 함수의 몸통 내에서만 사용할 수 있습니다.

paramN

함수로 전달되는 인수(argument) 의 이름.

statements

함수 몸통을 구성하는 문(statement).

* 참고 자료 2 : 유튜브 별코딩 - 화살표 함수 기본편

const name = function () {
    console.log("곰인간");
};

name(); // 곰인간

위 선언식과 비슷하게 보이지만, 

name이라는 변수를 선언하고, 거기에 익명 함수를 할당했다.

선언식과는 다르게 호이스팅 되지 않는다.


2. 화살표 함수

화살표 함수는 ES6에서 등장한 함수를 정의하는 또다른 문법이다. 

* 참고 자료 1 : MDN Web Docs - 화살표함수(Arrow Function)

화살표 함수는 기존에 함수 표현식을 훨씬 간결하게 작성 할 수 있는 장점이 있다.

    (param1, param2, …, paramN) => { statements }
    (param1, param2, …, paramN) => expression
    // 다음과 동일함:  => { return expression; }

    // 매개변수가 하나뿐인 경우 괄호는 선택사항:
    (singleParam) => { statements }
    singleParam => { statements }

    // 매개변수가 없는 함수는 괄호가 필요:
    () => { statements }

화살표 함수 기본 구문

* 참고 자료 2 : 유튜브 별코딩 - 화살표 함수 기본편

const name = () => {
    console.log("곰인간");
}; // 함수를 name 변수에 할당

name(); // 곰인간

// 화살표 함수는 코드가 한 줄 밖에 없을 경우 중괄호와 return 키워드를 생략 가능하다.
const name = () => console.log("곰인간")

name(); // 곰인간

화살표 함수는 이름이 없는 익명 함수이다.

// 함수 선언식
function add(a, b) {
    return a + b;
}

add(); 

// 함수 선언식을 화살표 함수로 변형
const add = (a, b) => {
    return a + b;
};

add();

 // 화살표 함수는 코드가 한 줄 밖에 없을 경우 중괄호와 return 키워드를 생략 가능하다.
const add = (a, b) => a + b;

add();

함수 선언식을 화살표 함수로 변형

// 1개의 매개변수 text를 받아서 console에 출력
function print(text) {
    console.log(text);
}

print("곰인간");

// 화살표 함수
const print = (text) => console.log(text);
// 매개변수가 하나 뿐이면 매개변수를 감싸는 괄호를 생략 할 수 있다.
print("곰인간");

// 매개변수가 2개 이상이면 괄호를 생략 할 수 없다.
const print = (text1, text2) => console.log(text1);

print("곰인간");


// 매개변수가 없을 때도 괄호는 생략 할 수 없다.
const print = () => console.log("곰인간");

print("곰인간");

매개변수에 따른 화살표 함수식 간결화

// 객체를 return 하는 함수
const getName = () => {
    return { name: "곰인간" };
};

console.log(getName()); // { name: "곰인간" }

// 매개변수가 하나 뿐이니 괄호와 return을 생략하면 문법에 혼란이 온다. // undefiend가 출력
// 객체를 return 할 때는 소괄호로 감싸준다. 
const getName = () => ({ name: "곰인간" })

console.log(getName()); // { name: "곰인간" }

문법 이외에도 일반 함수와 화살표 함수

arguments와 가변함수 차이점이 있다.

일반 함수는 매개변수로 따로 명시해주지 않아도 arguments라는 변수를 암묵적으로 전달 받는다.

function name () {
    console.log(arguments);
}

name("곰인간", "보통인간", "그냥인간"); 

/* Arguments(3) ['곰인간', '보통인간', '그냥인간', callee: ƒ, Symbol(Symbol.iterator): ƒ]
0: "곰인간"
1: "보통인간"
2: "그냥인간" */ 
// arguments변수는 함수가 전달 받은 인자를 담고 있는 배열형태의 객체이다.

function name () {
    console.log(arguments[0]); // 
}

name("곰인간", "보통인간", "그냥인간"); // 곰인간

arguments변수는 인자의 갯수가 정해지지 않는 가변인자가 전달 되는 함수를 사용할 때 유용하다.

하지만,

화살표 함수는 일반 함수와 달리 arguments변수를 전달 받지 않는다.

const name = () => {
    console.log(arguments);
}

name("곰인간", "보통인간", "그냥인간");
// Uncaught ReferenceError: arguments is not defined

Uncaught ReferenceError: arguments is not defined

자바스크립트는 arguments를 찾을 수 없다는 에러를 표시한다.

그렇다면 화살표 함수는 일반 함수처럼 가변인자를 처리 하지 못 할까?

const name = (...anyting) => console.log(anyting[0]);

name("곰인간", "보통인간", "그냥인간"); // 곰인간

/* 화살표 함수에 가변인자를 처리하려면 매개변수에 
...(나머지 매개변수 구문)anyting(아무 매개변수)를 넣어서 출력한다. */

화살표 함수도 위와 같이 매개변수에 아무 변수나 넣고 ...(나머지 매개변수 구문)을 넣으면 출력이 된다.


* 어렵습니다..어렵습니다..

그냥 쓰라고 하면 쓰겠는데 동작원리를 알려고 하니까 어렵습니다..

MDN Web Docs랑 유튜브 별코딩님 영상을 참고했습니다.

아주아주아주아주 많은 도움이 되었습니다.

하루죙일 돌려서 듣고, 돌려서 듣고, 돌리고, 돌리고~

중구난방 괴상망측하게 정리해봤습니다.

댓글