엘리스 AI
[2주차]JavaScript - 함수와 함수객체
욘아리
2023. 3. 8. 22:25
함수(function)란 작업을 수행하거나 값을 계산하는 명령문의 집합입니다.
함수 선언식
// 함수 정의
function area(width, height) {
return width * height; // 함수 본문
}
area(10, 20); // 함수 호출
- function 키워드로 시작
- 함수 이름 : area 보통 동사 형태
- 매개변수 : width, height 인자로부터 전달받은 값이 들어가는 통로
- return : 함수 안에 데이터를 저장할 때 사용
- 반환값 : width * height 함수의 출력값
- 인자 : 10, 20 함수에게 전달하는 데이터
함수 표현식
// 함수 정의
let area = function (width, height) {
return width * height; // 함수 본문
}
area(10, 20); // 함수 호출
- let 또는 const 키워드로 변수 선언 후 그 변수에 함수 할당
- 변수에 할당되므로 값으로 취급
📍들어올 인자가 몇 개인지 모를 때 - rest 연산자
// 방법 1. 반복문
const add = function (...arr) { // 들어오는 모든 인자를 arr로 만들겠다.
let sum = 0;
for (var x of arr) {
sum += x;
}
return sum;
};
console.log(add(1, 3, 10, 12)); // 26
// 방법 2. 누적 값 갱신
const add = function (...arr) {
return arr.reduce((acc, x) => acc + x, 0);
};
✨Hoisting - 함수 선언식과 표현식의 차이
자바스크립트 엔진이 코드를 해석할 때 선언된 변수나 함수를 코드 상단으로 끌어올리는 현상입니다.
- 함수 선언식은 전체가 호이스팅 되기 때문에 정의하기 전에 호출할 수 있습니다.
- 함수 표현식은 변수의 값이 호이스팅 되지 않기 때문에 정의하기 전에 호출할 수 없습니다.
함수와 객체
JavaScript에서 함수는 일급 객체입니다.
// 익명 함수
const add = function(a, b) {
return a + b;
};
// 배열의 요소로 사용
const arr = [add, function(c) {return c * c; }];
// 함수의 인자로 전달
function apply(func, x) {
return func(x);
}
// 함수의 반환값으로 사용
function makeFunc(n) {
return funtion(x) {
return x + n;
}
const plusOne = makeFunc(1);
const plusTwo = makeFunc(2);
console.log(plusOne(10)); // 11
console.log(plusTwo(10)); // 12
Scope
변수에 접근할 수 있는 범위를 말합니다.
함수 스코프
함수 내에서 정의된 변수는 해당 함수 내에서만 사용할 수 있고 유효하다는 것을 의미합니다. 함수 밖에서 정의된 변수는 전역 변수로서 어디든 접근할 수 있습니다.
var x = "global"; // 전역 변수
function foo() {
var x = "local"; // 지역 변수
console.log(x); // local
}
foo(); // local
console.log(x); // global
블록 스코프
중괄호({})로 둘러싸인 영역 내에서 정의된 변수는 해당 영역 내에서만 사용할 수 있고 유효하다는 것을 의미합니다.
let x = "global"; // 전역 변수
if (true) {
let x = "local"; // 지역변수
console.log(x); // local
}
console.log(x); // global
closure
함수와 함수가 선언된 어휘적 환경의 조합입니다. 이 환경은 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역 변수로 구성됩니다.
function makeCounter() {
let count = 0; // 지역 변수
return function() { // 클로저(count를 기억함)
return ++count;
};
}
const counter1 = makeCounter(); // 카운터 생성
const counter2 = makeCounter(); // 다른 카운터 생성
console.log(counter1()); // 1 (counter1의 count 값)
console.log(counter1()); // 2 (counter1의 count 값 증가)
console.log(counter2()); // 1 (counter2의 count 값)
console.log(counter2()); // 2 (counter2의 count 값 증가)
고차함수
함수를 인자로 받거나 반환하는 함수입니다.
// 배열을 받아 각 요소에 적용할 콜백함수와 초기값을 인자로 받아 배열을 축약하는 고차함수 reduce 정의
function reduce(array, callback, initialValue) {
let accumulator = initialValue; // 누적값 초기화
for (let i = 0; i < array.length; i++) {
accumulator = callback(accumulator, array[i]); // 콜백함수 실행하여 누적값 갱신
}
return accumulator; // 최종 누적값 반환
}
// reduce 고차함수 사용 예시
// 배열 요소들을 모두 더하는 콜백함수 정의
function sum(a, b) {
return a + b;
}
// 배열 요소들을 모두 곱하는 콜백함수 정의
function product(a, b) {
return a * b;
}
const numbers = [1, 2, 3, 4];
console.log(reduce(numbers, sum, 0); // 10
console.log(reduce(numbers, product, 1); // 24