Search

9장 함수

대분류
언어
서적
소분류
JS DeepDive
주요 레퍼런스
https://velog.io/@hustle-dev/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Deep-Dive-1012%EC%9E%A5
태그
함수
화살표함수
매개변수
인수
반환문
재귀
중첩
콜백
최종 편집 일시
2024/10/27 15:41
생성 일시
2024/01/25 08:42
13 more properties

함수란?

문으로 구현하고 코드 블록을 감싸서 하나의 실행 단위로 정의한 것
함수정의를 통해 생성하고 함수 호출을 통해 실행
구조 : function isFunction(매개변수) {return 반환값}; isFunction(인수);
매개변수 : 내부로 입력을 전달받는 변수
인수/전달인자 : 입력
반환값 : 출력
isFunction(매개변수)에서 (매개변수)는 함수 호출 연산자

함수를 사용하는 이유

코드의 재사용
유지보수의 편의성
코드의 신뢰성
코드의 가독성

함수 리터럴

객체 타입의 값 - 호출 가능한 객체
function 키워드, 함수 이름, 매개변수 목록, 함수 몸체
함수 이름 : 함수 몸체 내에서만 참조할 수 있는 식별자

함수 정의

함수 선언문

함수 리터럴과 형태 동일
리터럴은 함수 이름을 생략할 수 있으나 함수 선언문은 함수 이름을 생략할 수 없다.
리터럴과 선언문 구분법
함수 리터럴이 단독으로 쓰인다 --> 함수 선언문
함수 리터럴이 값으로 평가되어야 하는 문맥이다 --> 함수 리터럴 표현식
// 단독사용 -> 함수 선언문(이름 생략 불가) function foo() { console.log('foo') } foo(); // foo <-- 호출할 수 있다! 그러나 어떻게 호출한 걸까?? // 자바스크립트 엔진이 생성된 함수를 호출하기 위해 함수 이름과 동일한 식별자를 암묵적으로 생성하고 거기에 함수 객체 할당했기 때문 // === var foo = function foo() { console.log('foo'); }; // 함수리터럴 (function bar() { console.log('bar'); }); bar(); // ReferenceError: bar is not defined
JavaScript
복사

함수 표현식

일급 객체 : 값의 성질을 갖는 객체
함수 리터럴의 함수 이름은 생략이 가능
리터럴은 이것이 일반적이고 이를 익명함수라고 명명

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

console.log(add(2, 5)); // 7 console.log(sub(2, 5)); // TypeError function add(x, y) { return x + y; } var sub = function (x, y) { return x - y; };
JavaScript
복사
함수 선언문 --> 런타임 이전 엔진에 의해 먼저 실행되어 식별자를 암묵적으로 생성하고 생성된 함수 객체를 할당. --> 함수 호이스팅이 발생
함수 표현식 --> 런타임 이전 엔진에 의해 변수가 호이스팅되어 undefined로 할당되어 있음

Function 생성자 함수

Function 생성자 함수로 함수를 생성하면 클로저 생성 X 및 함수 선언문이나 함수 표현식으로 생성한 함수와 다르게 동작
var add = new Function('x', 'y', 'return x + y'); console.log(add(2, 5)); // 7
JavaScript
복사

화살표 함수(ES6) (lambda function)

화살표 함수는 표현이 간략한것 뿐만아니라 내부 동작 또한 간략화
const add = (x, y) => x+y; console.log(add(2,5));
JavaScript
복사

함수 호출

매개변수와 인수

함수는 매개변수의 개수와 인수의 개수가 일치하는 지 체크X
매개 변수보다 인수가 많은 경우 초과된 인수는 무시

인수 확인

매개변수와 인수의 개수가 일치하는 지 확인하지 않고, 동적 타입 언어여서 인수확인이 어렵기 때문에 함수 내부에서 확인을 하거나 기본값을 할당하여 확인 필요.

매개변수의 최대 개수

매개변수는 최대 3개이상 넘지 않는 것을 권장
--> 함수는 한 가지 일만 해야하며 가급적 작게 만들어야한다.

반환문

함수 호출 = 표현식
--> return 키워드가 반환한 표현식의 평가 결과값으로 평가되기 때문

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

객체 타입인수는 '참조 값'이 복사되어 매개변수에 전달되기 때문에 원본이 변경되지만 원시타입은 값 자체가 복사되어 매개변수에 전달되어서 새로운 메모리에 그 값을 할당하여 사용하기 때문에 부수효과 발생 X

다양한 함수의 형태

즉시 실행 함수

함수 정의와 동시에 즉시 호출되는 함수 --> 즉시 실행 함수라고 하고 단 한 번만 호출
그룹 연산자의 피연산자는 값으로 평가
기명 또는 무명함수를 그룹 연산자’()’로 감싸면 함수 리터럴로 평가되어 함수 객체가 됨
// 익명 즉시 실행 함수 (function() { var a = 3; var b = 5; return a * b; }()); // 기명 즉시 실행 함수 (function foo() { var a = 3; var b = 5; return a * b; }()); foo(); // ReferenceError: foo is not defined // 선언문 <- (표현식) // 즉시 실행 함수도 일반 함수처럼 값을 반환할 수 있다. var res = (function () { var a = 3; var b = 5; return a * b; }()); console.log(res); // 15 // 즉시 실행 함수에도 일반 함수처럼 인수를 전달할 수 있다. res = (function (a, b) { return a * b; }(3, 5)); console.log(res); // 15
JavaScript
복사

재귀 함수

함수 자기 자신을 호출하는 것을 재귀 호출이라 하며 재귀 함수는 자기 자신을 호출하는 행위, 즉 재귀 호출을 수행하는 함수를 말함.
재귀함수는 자신을 무한 호출하기 때문에 탈출 조건을 반드시 만들어야 한다. --> 그렇지 않으면 스택 오버플로가 발생

중첩 함수

함수 내부에 정의된 함수를 중첩 함수 또는 내부 함수라고 한다.
외부 함수 = 중첩 함수를 포함하는 함수
function outer() { // 외부함수 var x = 1; // 중첩 함수 function inner() { var y = 2; // 외부 함수 변수를 참조 가능 console.log(x + y); // 3 } inner(); } outer();
JavaScript
복사

콜백 함수

함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수
고차함수
매개변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수
콜백 함수를 자신의 일부분으로 합성하고 고차함수는 매개변수를 통해 전달받은 콜백 함수의 호출 시점을 결정해서 호출한다.
고차 함수에 의해 호출되며, 이때 고차함수는 필요에 따라 콜백함수에 인수를 전달할 수 있다.
// 콜백 함수를 사용하는 고차 함수 map var res = [1, 2, 3].map(function (item) { return item * 2; }); console.log(res); // [2, 4, 6] // 콜백 함수를 사용하는 고차 함수 filter res = [1, 2, 3].filter(function (item) { return item % 2; }); // filter의 predicate --> true또는 false를 반환함. // 첫번째인자: element, 두 번재인자: index, 세 번째 인자: 배열 전체 console.log(res); // [1, 3] // 콜백 함수를 사용하는 고차 함수 reduce res = [1, 2, 3].reduce(function (acc, cur) { return acc + cur; }, 0); console.log(res); // 6
JavaScript
복사

순수 함수와 비순수 함수

순수함수 : 부수 효과가 없는 함수 - 함수 내부에서 처리
var count = 0; // 현재 카운트를 나타내는 상태 // 순수 함수 increase는 동일한 인수가 전달되면 언제나 동일한 값을 반환한다. function increase(n) { return ++n; } // 순수 함수가 반환한 결과값을 변수에 재할당해서 상태를 변경 count = increase(count); console.log(count); // 1 count = increase(count); console.log(count); // 2
JavaScript
복사
비 순수 함수 : 부수효과가 있는 함수 - 외부 상태에 의존하거나 외부 상태를 변경
var count = 0; // 현재 카운트를 나타내는 상태: increase 함수에 의해 변화한다. // 비순수 함수 function increase() { return ++count; // 외부 상태에 의존하며 외부 상태를 변경한다. } // 비순수 함수는 외부 상태(count)를 변경하므로 상태 변화를 추적하기 어려워진다. increase(); console.log(count); // 1 increase(); console.log(count); // 2
JavaScript
복사