12장 함수

도롱뇽·2023년 1월 27일
0
post-thumbnail

함수의 사용이유

함수는 필요할 떄 여러번 호출할 수 있다. 즉, 실행 시점을 개발자가 결정할 수 있고 몇 번이든 재사용이 가능하다
함수는 몇 번이든 호출할 수 있으므로 코드의 재사용이라는 측면에서 매우 유용하다

코드의 중복을 억제하고 재사용성을 높이는 함수는 유지보수의 편의성을 높이고 실수를 줄여 코드의 신뢰성을 높이는 효과가 있다.

적절한 함수 이름은 함수의 내부 코드를 이해하지 않고도 함수의 역할을 파악할 수 있게 돕는다. 이는 코드의 가독성을 향상시킨다

함수 정의

함수 정의 방식에는 4가지가 있다

function add(x,y){ //함수 선언문
	return x+y
}

const add = function(x,y){ //함수 표현식
	return x+y
}

const add = new Function('x','y','return x+y') //함수 표현식

const add = (x,y) => x+y // 함수 선언문

함수 표현식

const add = function foo(x,y){
	return x+y
}

console.log(add(1,2)) // 3

console.log(foo(1,2)) // foo is not defined

함수는 함수이름으로 호출하는 것이 아니라 함수 객체를 가리키는 식별자로 호출한다

함수 선언문과 표현식은 서로 함수의 생성 시점이 다르다

선언문은 코드가 순차적으로 실행되는 시점인 런타임 이전에 자바스크립트 엔진에 의해 먼저 실행된다.
즉, 선언문으로 작성하면 런타임 이전에 함수 객체가 먼저 생성된다 그리고 자바스크립트 엔진은 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고 생성된 함수 객체를 할당한다.
이를 자바스크립트 고유의 특징 함수 호이스팅이라고 한다

함수 표현식으로 함수를 정의하게되면 함수 호이스팅이 아니라 변수 호이스팅이 일어나게된다

함수 호이스팅과 변수 호이스팅은 같은건가???

둘은 아주 미묘한 차이가 있다
var키워드를 사용한 변수 선언문과 함수 선언문은 런타임 이전에 자바스크립트 엔진에 의해 먼저 실행되어 식별자를 생성한다는 점에서는 동일하다
하지만 var키워드는 undefined로 초기화되고 함수 선언문은 함수 객체로 초기화 된다
따라서 var키워드를 사용한 변수 선언문 이전에 변수를 참조하면 변수 호이스팅에 의해 undefined로 평가되지만
함수 선언문으로 정의한 함수를 함수 선언문 이전에 호출하면 함수 호이스팅에 의해 호출이 가능하다

즉시 실행 함수

반드시 ()그룹 연산자로 감싸주어야한다

(function(){
	var a = 3;
  	var b = 5;
  return a * b;
}())

즉시 실행 함수는 함수 이름이 없는 익명함수를 사용하는 것이 일반적이다

재귀함수

재귀 함수는 자기 자신을 호출하는 것을 재귀함수라고 부른다
반복되는 처리를 위해 사용한다

function factorial(n){
  
  if(n <= 1) return 1;
  
  return n * factorial(n -1);
}

재귀 함수는 반복되는 처리를 반복문 없이 구현할 수 있다는 장점이 있지만 무한 반복에 빠질 위험이 있고, 이로인해 스택 오버플로 에러를 발생시킬 수 있으므로 조심해야한다.
따라서 재귀함수는 반복문을 사용하는 것보다 재귀함수를 사용하는 편이 더 직관적으로 이해하기 쉬울 떄만 한정적으로 사용하는것이 바람직하다.

중첩 함수

function outer(){
	var x= 1;
  
  	function inner(){
    	var y = 2;
      // 외부 함수의 변수를 참조할 수 있다
      console.log(x+y);
    }
  inner();
}

outer()

중첩 함수는 외부 함수 내부에서만 호출할 수 있다.

콜백 함수

함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 콜백함수라고 하며, 매개변수를 통해 함수의 외부에서 콜백함수를 전달받은 함수를 고차 함수라고 한다.

function repeat(n,f){
  for(let i = 0; i<n; i++){
	f(i)
  }
}

function logAll(i){
	console.log(i)
}

repeat(5,logAll); // 0,1,2,3,4

순수함수,비순수 함수

어떤 외부 상태에 의존하지도 않고 변경하지도 않는 함수를 순수함수라고 한다
외부 상태에 의존하거나 외부 상태를 변경하는 함수를 비순수 함수라고 한다

let count = 0;

//순수함수
function increase(n){
	return ++n;
}

//비순수 함수

function increase(){
	return count += 1;
}
profile
재생재생열매

0개의 댓글