함수

Jun Hyoung Park·2022년 7월 11일
0

함수

  • 일련의 과정을 하나의 실행 단위로 정의
	function add(x,y){
     	return x+y; 
    } // 코드블록이기 때문에 ;생략 

함수 리터럴

  • 객체타입의 값이기 때문에 가능
    • 객체타입의 값(?)
      • 원시타입과 달리 식별자가 함수 객체의 주소 값을 참조하기 때문에
	//add 이름-> 식별자, 몸체 내에서만 사용 가능 
	// 이름이 있다 -> 기명함수
	// 없다 -> 익명함수
	var a = function add(x,y){
      return x+y;
    };  // 값이므로 ;을 붙임
  • 일반객체와 다른점
    • 객체는 호출이 안되지만 함수는 호출 가능

함수의 정의

  • 함수 선언문이 평가될 때 함수 이름과 동일한 식별자가 암묵적으로 생성되고 함수 객체 할당
	// 1. 함수 평가: 함수와 동일한 이름의 식별자 생성
    // 2. 함수 객체 할당: 함수 객체가 들어있는 메모리의 주소를 동일한 이름의 식별자가 참조한다
	function a(){
    ~~~~~~
    }

함수 선언문

  • 함수리터럴과 형태가 동일
	//선언문
	function a(){
    	~~
    }
	
    //리터럴 표현식 
    //()그룹연산자에 의해 피연사자 되어 값으로써 사용이 된다
   (function a(){});

함수 표현식

  • 리터럴로 생성한 함수를 변수에 저장한 형태
  • 함수는 일급객체이다
    • 값으로써 사용이 가능한 객체
  • 함수리터럴은 이름을 생략하는 익명함수 형태가 일반적이다
    • 변수에 할당되는 값이므로 식별자가 임으로 생성되지않는다
      • 즉, 함수 내부에서만 사용이 가능한 식별자를 쓸 필요가 없다
	var a = function(){};
  • 차이점
    • 선언문: 표현식이 아닌 문
    • 표현식: 표현식인 문

정리

함수리터럴: 값으로써의 함수
선언문: 기명함수, 값이 아닌 문
표현식: 함수리터럴을 변수에 저장해서 사용, 값인 문

함수생성 시점과 함수 호이스팅

  • 선언문
    • 런타임 이전에 생성
      • 함수 객체 생성, 식별자 암묵적으로 생성, 함수 객체 주소 값 할당
    • 호이스팅
      • 호출이 어디서든 가능하다
      • 런타임 이전에 이미 함수 객체가 생성되었기 때문에 가능하다
    • 변수 호이스팅과의 차이점
      • 변수: undefined로 초기화만 이루어짐
      • 함수: 함수 객체의 주소가 할당된 상태
	console.log(a()); // 1
	console.log(b); // undefined

	// 런타임 이전에 생성및 할당이 이루어짐
	function a(){
    	return 1;
    }
	// 런타임 이전에 생성되고 undefined로 초기화된 상태
	let b = 3;
  • 표현식
    • 변수 호이스팅이 발생
    • 변수에 할당되는 형태이기 때문에
	// 변수 a 생성
 	// undefined로 초기화
	console.log(a()) // undefined 
	var a  = function(){~~~~};
  • 생성자함수
    • 객체를 생성하는 함수
    • 함수 생산으로는 일반적으로 사용하지않음
	var a = new function(~~~);
  • 화살표 함수
    • function 키워드 대신 => 사용하여 간략적
    • 항상 익명함수
    • 내부 동작도 간략
      • 생성자 함수로 사용할 수 없음
      • this 바인딩 방식이 다름
      • prototype, arguments가 없음
	const a = (x,y) =>x+y;
	console.log(a(2,5))  // 7

함수호출

매개변수와 인수

  • 함수를 실행하기 위해 필요한 값을 함수 외부에서 내부로 전달
  • 함수호출 -> 매개변수생성(undefined초기화) -> 인수할당
  • 인수 개수를 체크하지않음
    • 부족하면 undefined의 값으로 사용
    • 많으면 argument객체의 프로퍼티로 보관
 	function a (매개변수){}
	a(인수);

인수확인

  • 문제점
    • 타입이 정적으로 정의되지 않음
    • 개수를 확인하지 않는다
  • 해결
    • 매개변수 기본값 설정
      • undefined로 사용되지 않게 하려고
    • 타입스크립트와 같은 정적 타입 사용

매개변수 최대개수

  • 문제점
    • 많을수록 이해하기 복잡
    • 함수는 한가지의 일을 수행
    • 3개를 권장 넘을경우 객체에 담아 전달

반환문

  • return키워드 + 표현식(반환값)
  • 값 생략(undefined 반환)
  • 역할
    • 결과를 함수 외부에 반환
    • 함수의 실행 종료

참조에 의한 전달과 외부 상태의 변경

  • 매개변수 인수의 타입에 따라 방식이 달라짐
    • 원시값: 값의 복사
      • 변경 불가능한 값 -> 재할당을 통해 할당
    • 객체: 주소값의 전달
      • 참조하여 변경이 가능
      • 상태의 추적이 어려움
      • 순수함수를 사용
        • 외부상태를 변경하지 않고 외부상태에 영향을 받지않는 함수
	
	let a = 1;
	const b ={
    	c=2
    };
	// 원시타입 = 1이 다른 메모리에 재할당 된 후 변수에 할당
    // 객체 = 참조값인 주소 값을 전달하기 때문에 값에 직접적인 접근이 가능
	// 객체는 불변성의 특성을 갖지 않는다 
	function c(a,b){
    	a=3;
      	b.c =4;
    }
	c(a,b);
	console.log(a,b.c); //1, 4

다양한 함수의 형태

즉시 실행 함수

  • 정의와 동시에 호출
  • 단 한 번만 호출
  • 익명 함수
	(function(~~~){}());

재귀함수

  • 자기자신을 호출하는 것

중첩함수(내부함수)

  • 함수내부에서 정의
  • 헬퍼함수: 외부함수를 돕는 역할
  • 외부함수: 중첩 함수를 포함
	function outer(){
      function inner(){
      }
	 inner();      
    }
	outer();

콜백함수

  • 인수로 함수가 전달된 것
  • 교차함수: 함수의 외부에서 콜백함수를 전달받은 함수
  • 공통 로직을 정의 경우에 따라 변화는 로직은 함수 외부에서 함수 내부로 전달
    • 반복적으로 사용되는 부분은 따로 정의하고 수행에 따라 값이 달라지는 함수들은 밖에서 정의한다
	function repeat(n,f){
    	for(let i =0; i<n; i++){
        	f(i);
        }
    }
	var logAll = function(i){
    	console.log(i);
    };

	repeat(5,logAll);
  • 고차함수 내부에만 호출된다면 익명 함수 리터럴로 정의
  • 고차함수 호출 때마다 생성
	repeat(5, function(i){
   		if(i%2) console.log(i);
    });
  • 다른 곳에서도 사용이 된다면 외부에 정의
  • 생성은 한번 -> 고차함수가 호출 될 때마다 콜백 함수 생성

순수함수 비순수함수

  • 순수함수
    • 부수 효과 없는 함수: 외부 상태에 의존하거나 변경 하지 않음
  • 비순수함수
    • 부수 효과가 있는 함수: 외부 상태 의존, 변경
let count =0;
 //순수함수
function increaseA(n){ return ++n;}
//비순수함수
function increaseB(){ return ++count;}

// 재할당 반환
count = increaseA(count);
// 변경
increaseB();
profile
프론트엔드 지망생

0개의 댓글