[JS] 12. 함수 (1)

heyhey·2023년 7월 3일
0
post-thumbnail

12.1 ~ 12.4

12.1 함수란 ?

함수는 JS에서 가장 중요한 핵심 개념이다.
일반적으로 함수는 입력값이 있으면 출력을 내보내는 과정이다.

프로그래밍 언어의 함수는 일련의 과정을 문으로 구현하고 코드 블럭으로 감싸 하나의 실행 단위로 정의한 것

  • 매개변수 : 함수 내부로 전달받는 변수

  • 인수 : 입력

  • 반환값 : 출력

  • 함수 정의 : 함수 생성하기 (function add(){})

  • 함수 호출 : 함수 사용

12.2 함수를 사용하는 이유

함수는 코드의 재사용을 하기 위해 사용한다.
크드의 중복을 억제하고, 재사용성을 높인다.
=> 유지보수
=> 신뢰성
=> 가독성

12.3 함수 리터럴

리터럴은 값을 생성하기 위한 표기법이다.

  • 함수 이름 : 생략도 가능하다. (무명 함수 <=> 기명함수)
  • 매개 변수 목록 : 0개 이상의 매개변수를 소괄호로 감싼다. 인수가 순서대로 할당된다.
  • 함수 몸체 : 함수 호출에 의해 실행되는 코드 블록

함수는 객체이다. 일반 객체는 호출이 안되지만, 함수는 가능하다.

12.4 함수 정의

함수를 정의하는 방법 (변수는 선언 함수는 정의, 함수 객체가 할당되기 때문에 )

함수 선언문

function add(){}

  • 이름을 생략할 수 없다

  • 함수 선언문은 표현식이 아니라 문 이다. => 변수에 할당할 수 없다.

  • 함수를 선언한다고 해도, 리터럴 표현식으로 생성된 함수는 호출할 수 없다. (function sub(){})

    • 이 함수를 가리키는 식별자가 없기 때문에, 호출할 수 없다.
  • add는 호출이 가능하다. add는 JS 엔진이 암묵적으로 생성한 식별자이기 때문이다.

    • JS 엔진은 생성된 함수를 호출하기 위하여, 함수 이름과 동일한 이름의 식별자를 암묵적으로 생성하고, 거기에 함수 객체를 할당한다.

{} 이 단독으로 존재하면 블록문으로 해석하고, 우변에서 피연산자로 사용하면 리터럴로 해석한다.

함수 이름으로 호출하는 것이 아닌, 함수 객체를 가리키는 식별자로 함수를 호출하는 것이다.

함수 표현식

const add = function(){}

  • 함수 선언문은 표현식이 아니라 문 이다.

  • 자바스크립의 함수는 객체이다. => 함수를 값처럼 자유롭게 사용할 수 있다.

  • 리터럴의 함수 이름은 생략할 수 있고, 없는 것이 일반적이다

    • 이러한 형식으로 적어도 되지만, foooo를 호출할 순 없다. -const add = function foooo(){}

Function 생성자

const add = new Function('a','b','return a+b')

  • new 없이 생성해도 결과는 같다.
  • 일반적이지 않고, 추천도 안한다.
    • 클로저를 생성하지 않는다.
    • 함수 선언문이나, 표현식으로 생성된 함수랑 다르게 작동한다.

화살표 함수

const add = ()=>{}

  • 화살표 함수는 항상 익명 함수이다.

  • 생성자 함수로 사용할 수 없으며,

  • this 바인딩 방식이 다르고,

  • prototype 프로퍼티가 없다.

  • arguments 객체를 생성하지 않는다.

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

  • 함수 선언문으로 정의한 함수와 함수 표현식으로 표현한 함수의 생성 시점이 다르다.

  • 함수 선언문으로 선언한 함수는 선언문 이전에 호출 가능하다.

  • 함수 표현식으로 정의한 함수는 표현식 이전에 호출이 불가하다

add(); //
sub(); // => Error

function add() {}
const sub = function () {};

함수 선언문으로 정의하면, 런타임 이전에 함수 객체가 먼저 생성된다.
그리고 JS 엔진은 함수 이름과 동일한 식별자를 암묵적으로 생성하고 함수 객체를 할당한다.

함수의 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 것이 함수 호이스팅 이라고 한다.

변수 호이스팅과는 차이가 있다.
(var a 하면 a를 먼저 생성되는 것)

var 키워드로 선언된 변수는 값을 저장하지는 못하고 undefined로 초기화 되는 반면,
함수 선언문은 함수 객체로 초기화 가능하다.

함수 표현식은 그에 비해 변수에 할당되는 값이 리터럴이기 때문에, 할당문이 실행되는 그 때! 함수 객체가 된다.
(제작자는 함수 표현식을 사용할 것을 권장하고 있다. )

profile
주경야독

0개의 댓글