ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Javascript] 함수
    To infinity/Javascript 이론 2021. 6. 14. 23:52

    2021.06.11 ~ 12, Ver.1

     

    1. 함수

    함수선언문, 함수표현식

     

    2. 함수호출

    - 매개변수: 함수 정의 시 선언, 함수몸체 내부에서 변수와 동일하게 취급됨.

    - 함수호출: 표현식

    - 스코프

     

    result = undefined

    add 함수호출

    함수몸체 내부

      x=undefined, y=undefined

      런타임 환경 실행

      x=2, y=5

      x + y = 7

    result = 7

     

    - 매개변수의 개수와 인수의 개수가 일치하는지 체크하지 않기에 에러가 발생하지 않음

    단지, 인수가 할당되지 않은 매개변수의 값음 undefined임.

    so, 2 + undefined가 되서 NaN가 반환됨

    초과된 인수는 함수계산시에는 무시되지만 암묵적으로 arguments 객체의 프로퍼티로 보관됨

     

    [참고] argument객체 : 함수정의 시 매개변수 개수를 확정할 수 없는 가변인자 함수 구현시 사용

     

     

    3. 인수확인

    1) 인수의 타입과 반환되는 값의 타입 확인

    - 자바스크립트는 동적타입언어 이므로 매개변수의 타입을 사전에 지정할 수 없음.

    - 부적절한 호출을 사전에 방지할 수 없고 에러는 런타임에서 발생하게 됨. (컴파일 시점에 부적절한 호출 방지가 불가하다는 의미, 고로, 타입스크립트와 같은 상위확장을 도입하는것도 하나의 방법)

     

    2) 인수의 개수 확인

    - arguments 객체를 통한 인수개수 확인

    - 인수가 전달되지 않은 경우 단축평가를 사용해 매개변수에 기본값 할당

    - ES6에 도입된 매개변수 기본값을 사용하면 함수 내에서 수행하던 인수체크 및 초기화를 간소화 할 수 있음.

    작성: function(a=0, b=0, c=0)

     

     

    4. 매개변수의 최대개수

    - 이상적인 매개변수 개수 0개, 최대 3개를 넘어가지 않는게 좋음

    - 매개변수는 순서에 의미가 있으므로 유지보수에 좋지 않고 코드를 이해하는데 방해가 됨

    - 함수는 한가지 일만 해야하며 가급적 작게 만들어야 함

     

    - 객체를 인수로 사용하면 프로퍼티 키만 정확히 지정하면 매개변수 순서 상관없음

    - 주의: 외부에서 내부로 전달된 객체를 함수 내부에서 변경하면 외부의 객체가 변경되는 부수효과가 발생하니 조심

     

    5. 반환문

    - 역할

    1) 함수의 실행을 중단하고 함수 몸체를 빠져나감. 고로 그 후에 존재하는 문은 무시됨

    2) return 키워드 뒤에 오는 표현식을 평가해 반환함. 반환값으로 사용할 표현식을 명시적으로 지정하지 않으면 undefined가 반환됨

    3) return 키워드의 반환값으로 사용할 표현식 사이에 줄바꿈이 있으면 세미콜론 자동삽입 기능에 의해 반환값으로 사용할 표현식이 무시됨.

     

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

    - 원시타입인수: 원시값은 변경불가능한 값이므로 함수 내부에 들어갔을 때 재할당을 통해 새로운 원시값으로 교체

    - 객체타입인수: 참조값은 변경가능하므로 재할당 없이 직접 할당된 객체를 변경. 함수외부에서 함수몸체 내부로 전달한 참조값에 의해 원본객체가 변경되는 부수효과 발생

    - 이런 현상이 발생하는 이유: 객체가 변경가능한 값이고 참조에 의한 전달방식으로 동작하기 때문

    - 문제점을 해결하기 위한 방안

    1) 객체변경을 추적: 옵저버 패턴

    2) 객체를 불변객체로 만들어서 사용 (객체의 상태변경이 필요한 경우에는 객체의 방어적복사-깊은복사-를 통해 새로운 객체를 생성 및 재할당)

    - 외부상태를 변경하지 않고, 외부상태에 의존하지도 않는 함수: 순수함수

     

    7. 다양한 함수형태

    1) 즉시실행함수(IIFE)

    - 함수의 정의와 동시에 즉시 호출되는 함수

    - 반드시 그룹연산자 ()로 감싸야 함 EX. (function (){}())

    이유는 먼저 함수 리터럴을 평가해서 함수 객체를 생성하기 위함.

    - 즉시실행함수 내에 코드를 모아두면 변수나 함수 이름의 충돌을 방지할 수 있다.

     

    2) 재귀함수

    - 자기자신을 호출하는 함수

    - 반복되는 처리를 위해 사용

    - 무한호출이 가능하므로 탈출조건을 꼭 명시해야함

    - 따라서 스택 오버플로 에러를 발생시킬 수 있으므로 재귀함수 사용이 더 직관적일 경우를 제외하고는 반복문(if, while)을 사용하는 것이 좋음.

     

    3) 중첩함수

    - 함수 내부에 정의된 함수

    - ES6 부터는 if문이나 for문 등의 코드블록 내에서도 정의 가능 (이전에는 코드최상위 또는 다른함수 내부에서만 정의 가능)

    다만, 호이스팅으로 인해 혼란이 발생할 수 있으므로 for문이나 if문등의 코드블록에서 함수선언문을 통해 함수를 정의하는 것은 바람직하지 않음.

     

    4) 콜백함수, 고차함수

    - 함수형 프로그래밍 패러다임, 비동기처리, 배열고차함수에 사용

     

    - 콜백함수: 함수의 매개변수를 통해 다른함수의 내부로 전달되는 함수

    - 고차함수: 매개변수를 통해 함수의 외부에서 콜백함수를 전달받은 함수

     

    - 중첩함수는 고정이 되있지만 콜백함수는 외부에서 고차함수 내부로 주입하기 때문에 자유롭게 교체할 수 있는 장점이 있음

    - 콜백함수는 고차함수에 의해 호출시점이 결정되므로 함수 자체를 전달해야함.

     

    5) 순수함수와 비순수함수

    - 순수함수: 외부상태에 의존하지도 않고 변경하지도 않는, 즉 부수효과가 없는 함수

    - 비순수함수: 외부상태를 직접참조, 매개변수를 통해 객체를 전달받음

     

    함수형 프로그래밍: 순수함수 + 보조함수 = min 부수효과 -> 불변성을 지향하는 프로그래밍 패러다임

    조건문과 반복문 제거 (로직의 흐름을 이해하기 어렵게 해서 가독성을 해치기 때문)

    변수값의 생명주기 최소화

     

    [참고] 함수에서 return이 실행되면 그 함수의 수명은 다한 것임 (Dead)


    이건 책 내용을 거의 그냥 옮겨적다시피 한거여서 좀 정리하고 올릴까하다가 내가 함수부분을 자꾸 찾아보길래 일단 업로드 ㄱㄱ

Designed by Tistory.