함수

GunYong·2023년 7월 8일
0

다양한 함수들

재귀 함수

함수가 자기 자신을 호출하는 것을 재귀 호출이라고 한다. 자기 자신을 재귀 호출하는 함수를 재귀 함수라고 부른다.

재귀 함수는 자기 자신을 무한정 호출하기 때문에 제한 조건이 필요하다. 즉 탈출조건이다. 탈출 조건이 없으면 함수가 무한 호출되어 스택 오버플로 에러가 발생한다.

재귀 함수의 대표적인 예로 팩토리얼 함수가 있다.

function factoiral(n) {
  if(n<= 1) return 1; // 탈출조건
  
  return n * factorial(n-1);
}

중첩 함수

함수 내부에 정의된 함수를 nested function 이라고 부른다. 그리고 중첩 함수를 포함하는 함수를 외부 함수라고 부른다. 중첩 함수는 외부 함수 내에서만 호출 할 수 있다.

function outer() {
  let a = 1;
  
  function inner() {
    let b = 2;
    console.log(a + b);
  }
  
  inner();
}

변수의 생명 주기

변수에는 생성되고 소멸되는 생명 주기가 있다.

let x = 'global';

function practice() {
  console.log(x);
  let x = 'local';
}

practice();
console.log(x);

위의 예제를 보면 함수 내에서 선언된 지역 변수는 이미 선언되었고 undefined로 초기화 된다. 전역 변수를 참조하는 것이 아니라 지역 변수를 참조해 값을 출력한다. 지역 변수는 함수 전체에서 유효하다.

호이스팅은 스코프를 단위로 동작한다. 호이스팅은 변수 선언이 스코프의 선두로 끌어 올려진 것처럼 동작하는 언어의 특징이다.

전역 변수의 문제점

모든 코드가 전역 변수를 참조할 수 있고 변경할 수 있다. 하지만 해당 변수의 유효 범위가 클수록 위험성이 커진다.

  1. 긴 생명 주기

    전역 변수는 생명 주기가 길어서 메모리도 오랫동안 소모한다. 그리고 같은 변수의 이름이 중복될 경우 재할당 될 위험성이 있다.

  2. 스코프 체인 상에서 종점에 존재

    변수를 검색할 때 전역 변수가 가장 마지막에 검색된다. 전역 변수의 검색 속도가 가장 느리다.

  3. 네임스페이스 오염

    자바스크립트는 파일이 분리되어 있어도 전역 스코프를 공유한다는 것이다. 그래서 다른 파일 내에서 동일한 이름으로 명시된 전역 변수나 전역 함수가 예상치 못하게 사용되서 오류를 발생할 수 있다.

전역 변수를 사용할때 주의깊게 사용하고 꼭 필요할때만 사용하도록 해야겠다.

let / const

ES6에서 생긴 새로운 변수 선언 let const 를 주로 사용한다.

let

  • 중복 선언 방지

    let a = 100;
    let a = 101; // SyntaxError : Identifier 'a' has already been declared
  • 블록 레벨 스코프

    let a = 100;
    {
      let a = 101;
      let b = 102;
    }
    console.log(a) // 100;
    console.log(b) // ReferenceError : 'b' is not defined

    let으로 선언된 변수는 블록 레벨 스코프를 따른다.

const

  • 선언과 초기화

    const는 선언과 동시에 초기화를 해야한다.

  • 재할당 금지

    한번 할당한 값을 재할당 하지 못한다.

    const a = 101;
    a = 102; // TypeError;
  • 재할당이 금지인 것 -> 불변은 아니다.

    const person = {
      name : 'gunyong';
    }
    person.name = 'gunyong1';
    console.log(person.name) // gunyong1

결론 : const를 쓰는것이 안전하다. 하지만 재할당이 필요한 경우의 변수는 let으로 선언해주자.

0개의 댓글