자바스크립트 함수 선언문

이번 포스트에서는 자바스크립트 함수 포스트에서 다루지 못했던 함수 선언문 특징에 대해서 정리해 보았습니다.

함수 선언문의 특징 1 : 호이스팅

함수 선언문은 코드 실행 전에 미리 메모리에 올려지기 때문에 함수를 선언하기 전에 호출할 수 있습니다. 즉, 함수가 코드 어디에서든 호출 가능합니다.

sayHello(); // "Hello, world!"

function sayHello() {
  console.log("Hello, world!");
}

함수 선언문의 특징 2 : 재선언

함수는 var 처럼 다른 function 혹은 var로 재선언 될 수 있습니다.

하지만 let, const, class로 재선언 될 수는 없습니다.

function a(b) {}
function a(b, c) {}
console.log(a.length); // 2
let a = 2; // SyntaxError: Identifier 'a' has already been declared

function 선언이 var에 의해 다시 선언되더라도, var 선언의 상대 위치에 관계없이 항상 함수 값을 재정의합니다.

이는 함수 선언이 호이스팅되므로 var 선언이 나중에 와서 값을 재정의하기 때문입니다.

var a = 1;
function a() {}
console.log(a); // 1

하지만 모듈 단계에서는 함수의 선언이 let 처럼 행동하기 때문에 함수로 재선언이 되지 않습니다.

// Assuming current source is a module
function foo() {}
function foo() {} // SyntaxError: Identifier 'foo' has already been declared

또한 use strict 모드에서도 블록 내 함수의 재선언이 불가능 합니다.

"use strict";
{
  function foo() {}
  function foo() {} // SyntaxError: Identifier 'foo' has already been declared
}

참고할 만한 글

Leave a Comment

목차