이번 포스트에서는 자바스크립트 함수 포스트에서 다루지 못했던 함수 선언문 특징에 대해서 정리해 보았습니다.
함수 선언문의 특징 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
}
참고할 만한 글
자바스크립트 함수 표현식
함수 표현식 문법 함수 표현식은 다양한 형태로 사용될 수 있습니다. 주의해야 할 점은 function 키워드만 사용하고 이름을 안 넣으면 함수 선언문으로 오해해서 오류가 발생한다는 점입니다. 함수 표현식은 변수에 할당되거나 다른 표현식의 일부로 사용되어야 합니다…. Read more
자바스크립트 화살표 함수
화살표 함수의 선언 방법들 괄호는 생략 가능합니다. 하지만 매개변수가 하나의 단순한 형태의 경우에만 생략이 가능합니다. 화살표 함수의 특징 this, arguments, super에 바인딩 되지 않으므로 메소드로 사용하면 안됩니다… Read more
Functions – JavaScript | MDN
Functions are one of the fundamental building blocks in JavaScript. A function in JavaScript is similar to a procedure—a set of statements that performs a task or calculates a value, but for a procedure to qualify as a function, it should take some input and return an output where there is some obvious relationship between the input and the output. To use a function, you must define it somewhere in the scope from which you wish to call it.