함수란 기능의 단위의 코드의 묶음이며, 입력값과 출력값을 가집니다.
function sum(a, b) {
return a + b;
}
위에서 선언한 sum 함수는 매개변수 2개를 받아 매개변수의 합을 반환해주는 함수입니다.
여기서 매개변수(parameter)란 함수를 선언할 때 입력되는 값입니다.
그렇다면 전달인자(argument)는 무엇일까요?
전달인자는 함수가 호출될 때 실제로 입력되는 값을 뜻합니다.
sum(3, 4)
// 이와 같이 sum 함수를 호출 할때 입력되는 숫자 3, 4는 전달인자
console.log(sum(3,4)) // 7
예시로 삼각형의 넓이를 구하는 함수를 작성해 봅시다.
function getTriangleAre(base, height) {
let triangleArea = (base * height) / 2;
return triangleArea;
}
const getTriangleArea = function(base, height) {
let triangleArea = (base * height) / 2;
return triangleArea;
}
const getTriangleArea = (base, height) => {
let triangleArea = (base * height) / 2;
return triangleArea;
}
// 함수의 body에 return문만 있는 경우 return과 중괄호 생략 가능
const getTriangleArea = (base, height) => (base * height) / 2;
세 함수는 모두 같은 로직을 가지고 있으나 각각의 차이점이 존재합니다.
선언식과 표현식은 호이스팅(hoisting)에차 그 차이를 보입니다.
Hello(); // 'hello'
Hello2() ; // error
const hi ='hi';
function Hello(){ console.log('hello') }
const Hello2 = function(){ console.log('hello') };
선언식의 경우 함수가 호출된 이후에 함수 선언이 이루어져도 호이스팅되어 정상적으로 잘 작동 되지만
함수 표현식의 경우에는 호이시팅 되지 않아 Hello2 함수는 실행되지 않는 것을 알 수 있습니다.
const cat = {
name: 'meow',
foo1: function() {
const foo2 = function() {
console.log(this.name);
}
foo2();
}
};
cat.foo1(); // undefined
const cat = {
name: 'meow',
foo1: function() {
const foo2 = () => {
console.log(this.name);
}
foo2();
}
};
cat.foo1(); // meow
function 키워드로 선언한 함수가 메소드로 호출되냐 함수 자체로 호출되냐에 따라 동적으로 this가 바인딩되는 반면, 화살표 함수의 경우는 선언될 시점에서의 상위 스코프를 this로 바인딩하게 되기 때문입니다.