본문 바로가기

Web 개발/JS

JavaScript 함수

  • JavaScript 함수
  • 선언적 함수 (Function Declaration)
  • 익명 함수 (Anonymous Function))
    • 함수 표현식 / 대입 함수 (Function Expression)
    • 화살표 함수 (Arrow Function)
    • 즉시 실행 함수 표현식 (IIFE)
NEW 키워드
선언적 함수, 호이스팅, 익명 함수, 함수 표현식, 대입 함수, 화살표 함수, this, 상위 스코프, argument 객체

# JavaScript 함수

  • 입력값(매개변수)을 받아서 특정 작업을 수행하고, 결과를 반환(return)하는 코드 블록
  • 자주 사용하거나 기능 단위로 함수를 만든다
  • 함수를 사용하면 코드의 재사용성이 높아지고 모듈화와 유지보수가 쉬워진다
  • 함수는 선언 → 호출 → 실행 순으로 진행된다

# 선언적 함수 (Function Declaration)

  • 함수 이름을 사용하여 함수를 정의하는 전통적인 방식
  • fucntion 키워드를 사용하여 이름을 붙여 선언한다
  • 함수 선언 후 반복 호출이 가능하여 재사용성이 높다
  • 호이스팅 지원으로 함수 선언 전이나 후에 호출 및 사용 가능하다
  • 호이스팅 : JavaScript이 코드를 실행하기 전에 변수와 함수 선언 부분을 위로 끌어 올려서 처리하는 것

 

문법

// 1. 함수 선언
function 함수(매개변수){
  /* 함수 코드 */
}
// 2. 함수 호출 및 실행
함수이름(인수);

 

선언 전 & 후 함수 호출 (호이스팅 지원)

/* 선언 전 함수 호출 */
declarFunc("선언적 함수");      // 호이스팅으로 실행 가능, 출력 : Hello, 선언적 함수!

/* 함수 선언 */
function declarFunc(name){
  return console.log(`Hello, ${name}!`);
}

/* 선언 후 함수 호출 */
declarFunc("선언적 함수");     // 출력 : Hello, 선언적 함수!

# 익명 함수 (Anonymous Function)

  • 함수 이름이 없는 함수로 변수에 할당하거나 즉시 실행해야 한다
  • 호이스팅 미지원으로 반드시 함수 선언 후 호출해야 한다 (함수 선언 전 호출시 에러 발생)

# 함수 표현식 / 대입 함수 (Function Expression)

  • 함수를 변수에 할당하여 정의하는 방식
  • 변수는 선언만 호이스팅(할당X)을 지원하지 않으므로 에러가 발생한다

 

문법

// 1. 함수 선언
var 변수 = function(매개변수){
  /* 함수 코드 */
}
// 2. 함수 호출 및 실행
변수이름(인수);

 

선언 전 & 후 호출 (호이스팅 미지원)

/* 선언 전 함수 호출*/
expressFuncLet("Let 대입 함수")   // [에러] ReferenceError: Cannot access 'expressFuncLet' before initialization
expressFuncVar("Var 대입 함수")   // [에러] TypeError: expressFunc is not a function
/* 함수 선언 */
let expressFuncLet = function(name){
  return console.log(`Hello, ${name}!`);
}
var expressFuncVar = function(name){
  return console.log(`Hello, ${name}!`);
}
/* 선언 후 함수 호출*/
expressFuncLet("Let 대입 함수") // 출력 : Hello, Let 대입 함수
expressFuncVar("Var 대입 함수") // 출력 : Hello, Var 대입 함수
  • var 변수 : var 변수는 선언만 호이스팅이 되고 재할당은 호이스팅되지 않으므로 undefined 가된다. undefined("대입함수")가 되기 때문에 타입 에러 발생
  • let 및 const 변수 : let과 const 변수 또한 선언만 호이스팅이 되지만, 할당 되기 전까지 접근을 막는 TDZ(Temporal Dead Zone, 사용할 수 없는 상태)가 된다. 때문에 참조 에러가 발생

# 화살표 함수 (Arrow Function)

  • fucntion을 사용하지 않고  =>  기호를 사용하여 함수를 정의하는 방식
  • ES6에서 도입되었으며, 기존 함수 표현식(Function Expression)을 더 짧고 간결하게 표현할 수 있다
  • {중괄호}를 생략하여 한 줄로 작성 가능(한줄로 작성시 return은 생략)
  • 매개변수가 하나일 경우 (소괄호) 생략이 가능  (매개변수가 없을 때는 소괄호 생략 불가능)
  • 기존 함수의 this는 현재 객체를 바인딩하는데, 화살표 함수 this는 상위 스코프의 this를 상속한다
    • this 가 필요한 경우 화살표 함수를 사용하지 않는다
    • 화살표 함수의 this는 상위 스코프는 "코드의 실행 환경"으로 브라우저에선 window, node.js에서는 global를 상속(참조)한다
  • 기존 함수에서는 arguments 객체를 사용 가능하지만, 화살표 함수에서는 arguments 객체를 사용할 수 없다

 

문법

// 1. 함수 선언
var 변수 = (매개변수) =>{
  /* 함수 코드 */
}
// 2. 함수 호출 및 실행
변수이름(인수);

 

예제 코드 (다양한 작성 방법)

// 매개변수가 없을때 : 소괄호 생략 불가능
let arrowFunc1 = () =>{
  return console.log(`Hello, 화살표 함수1!`);
}
arrowFunc1();

// 매개변수가 1개 일때 : 소괄호 생략 가능
let arrowFunc2 = name =>{
  return console.log(`Hello, ${name}!`);
}
arrowFunc2("화살표 함수2");

// 매개변수가 다수 일 때 : 소괄호 생략 불가능
let arrowFunc3 = (arg1, arg2) =>{
  return console.log(`Hello, ${arg1}, ${arg2}!`);
}
arrowFunc3("화살표3", "함수3,")

// 한줄로 작성 + 중괄호 생략 : {중괄호 생략}시 반드시 return을 생략한다
let arrowFunc4 = (name) => console.log(`Hello, ${name}!`);
arrowFunc4("화살표 함수4");

// 한줄로 작성 + 중괄호
let arrowFunc5 = (name) => {return console.log(`Hello, ${name}!`)};
arrowFunc5("화살표 함수5");

 

화살표 함수의 상위 스코프 (미권장)

<div class="parent">
  <div class="child">클릭</div>
</div>

<script>
const childEl = document.querySelector(".child");

childEl.addEventListener("click", function(){
  console.log(this) // 출력 : <div class="child">클릭</div>
})
childEl.addEventListener("click", ()=>{
  console.log(this) // 출력 : Window {window: Window, self: Window, document: document, name: '', location: Location, …}
})
</script>
  • 선언적 함수 (기본 함수)의 this는 자기 자신을 상속(참조)한다
  • 화살표 함수의 this는 상위 스코프(코드 실행 환경)을 상속(참조)한다

 

화살표 함수의 Arguments 객체 (사용 불가능)

// 기본함수
function regularFunction() {
  console.log(arguments); // arguments 객체는 함수에 전달된 모든 인수를 포함한다
}

regularFunction(1, 2, 3); 
// 출력 : Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]

// 화살표 함수
const arrowFunction = () => {
  console.log(arguments); // 화살표 함수는 arguments 객체를 지원하지 않는다
};

arrowFunction(1, 2, 3, 4); // [에러] Uncaught ReferenceError: arguments is not defined
  • arguments 객체
    • 함수 내부에서 함수에 전달된 모든 인수(arguments)를 배열처럼 다룰 수 있는 유사 배열 객체
    • arguments는 함수가 호출될 때 전달된 인수들을 순차적으로 저장하며, 배열처럼 인덱스를 통해 접근할 수 있다
    • 실제 배열은 아니므로 배열 메서드 (예: map, filter)는 사용할 수 없다

# 즉시 실행 함수 표현식 (IIFE, Immediately Invoked Function Expression)

  • 함수 표현식을 정의의 실행을 동시에 하는 함수

 

문법

(function() {
  /* 함수 코드 */
})();

 

예제 코드

// 기본
(function(name) {
  return console.log("Hello, IIFE!");   // 출력 : Hello, IIFE!
})();

// 화살표 함수 + 매개변수
((name)=>{
  return console.log(`Hello, ${name}!`);   // 출력 : Hello, 화살표 IIFE!
})("화살표 IIFE")

'Web 개발 > JS' 카테고리의 다른 글

JavaScript 객체의 프로퍼티와 메서드  (0) 2025.03.25
JavaScript 배열 메서드  (0) 2025.03.20
JavaScript 반복문과 제어  (0) 2025.03.14
JavaScript 조건문  (0) 2025.03.13
JavaScript 데이터 타입  (0) 2025.03.12