이 글은 자바스크립트 개론(Eloquent JavaScript 번역서)을 읽고 개인적으로 정리한 내용입니다.


2. 함수

1. 선언

  • 프로그램이 실행되기 전에 함수 선언은 미리 저장된다.
  • 프로그램이 실행될 때 함수 선언문이 나오지 않았더라도 먼저 호출할 수 있으며, 먼저 선언된 함수가 나중에 선언된 함수를 호출하는 것도 가능하다.

2. 유효범위(Scope)

  • 함수의 인자(parameter)와 함수 안에서 var 키워드로 선언된 변수는 그 함수 안에서만 유효하다. 함수 실행이 완료되면 인자, 변수는 사라진다.
  • 함수가 중첩된 경우 내부 함수안에서 선언된 변수 이름과 외부 함수에서 선언된 변수 이름이 같아도, 내부 함수의 변수를 변경하여도 외부 함수의 변수에 영향을 미치지 않는다.
  • 함수 안에서 같은 이름의 변수를 선언하지 않았으면, 외부 함수나 전역 변수에 접근하는 것이 가능하다.
  • 함수의 스코프는 프로그램 소스코드 상에서의 위치에 따라 결정되며, 이것을 어휘적 스코프(lexical scope)라고 한다.

호출 스택

  • 새로운 함수가 호출되고 그 함수의 실행이 종료되면 원래 프로그램이 실행되던 지점으로 돌아갈 필요가 있다. 기존의 실행지점에 대한 정보를 문맥(Context)이라고 하며 이것은 스택(Stack)에 쌓인다.

값으로서의 함수

  • 자바스크립트에서는 함수도 ‘값’에 속해서 함수 이름을 변수처럼 쓰거나 함수를 다른 함수에 전달하거나 함수를 반환하는 함수를 작성할 수도 있다.

클로저

  • 함수가 함수를 반환하고, 반환되는 함수에서 함수가 속한 함수의 지역변수를 반환할 때 외부 함수의 실행이 종료되서 호출스택에서 사라져도 지역변수는 유지된다.
  • 이 현상을 닫힘(closure)라고 하며, 남아있는 변수에 접근하는 함수를 클로저(closure)라고 한다.

인자

  • 선언된 매개변수(parameter)보다 더 적은 인자(argument)를 넘겨주면 남는 매개변수(parameter)는 undefined가 된다.
  • 선언된 매개변수(parameter)보다 더 많은 인자(argument)를 넘겨주면 남는 인자(argument)는 무시된다.

함수 작성 원칙

  • 함수가 발명된 이유는 코드의 재사용이다.
  • 함수를 사용하지 않고, 동일한 로직이 반복된다면 코드가 길어져서 읽기가 힘들어지고, 코드를 수정할 때 일일이 다 찾아야 하기 때문에 유지보수가 어려워진다.
  • 함수는 되도록 한 개의 기능만 수행해야 여러 상황에서 사용되기 좋다.
  • 확실하게 필요하다고 판단하지 않은 기발한 기능은 되도록 함수에 추가하지 않는 것이 좋다.

순수 함수

  • 순수 함수란 동일한 인자를 전달하면 항상 같은 값을 반환하는 함수를 말한다.
  • 순수 함수는 함수 호출만으로 해당 함수가 의도대로 동작하는지 확인할 수 있기 떄문에 테스트하기 좋다.
  • 순수하지 않은 함수는 온갖 외부 요인에 따라 함수의 결과값이 바뀌기 때문에, 해당 함수만을 호출하여 의도대로 동작하는지 확인하기 힘들다.
  • 순수 함수는 순수하지 않은 함수의 기능을 대체하기 힘들기 때문에 순수하지 않은 함수를 작성하는 것을 꺼려하지 말되, 되도록 순수한 함수를 작성하도록 하자.

재귀(Recursive)

  • 재귀란 함수 자기 자신을 호출하는 것을 말한다.
  • 재귀를 통해 반복문을 대체할 수 있지만 재귀는 반복문보다 10배정도 느리며, 재귀 호출을 하는 횟수가 많아지면 호출 스택이 넘치는 현상이 발생할 수 있다.


+ Recent posts