
함수를 변수나 상수의 값과 같이 다루는 언어에 있음.
javascript도 그 중 하나인 언어라는거즤 (☞゚ヮ゚)☞.
함수는 객체이니까 참조형이다.
즉, 함수 또한 다른 무언가의 값으로 들어갈 수 있음. 즉 객체와 배열의 값으로도 할당 가능.
let person = {
name: '홍길동',
age: 30,
married: true,
introduce: function (formal) {
return formal
? '안녕하십니까. 홍길동 대리라고 합니다.'
: '안녕하세요, 홍길동이라고 해요.';
}
};
console.log(person.introduce(true));
console.log(person.introduce(false));코드를 입력하세요
이렇게 객체의 함수 프로퍼티를 메서드 methods라고 불렀었다.
근데 ⭐ES6⭐ 부터 메서드의 정의가 달라졌음(단축 표현 메서드만 가리킨다)
함수가 다른 함수를 인자로 전달 받는다.
📌 전달 받는 함수를 고차함수
📌 전달 되는 함수를 콜백함수
let list = [1, 2, 3, 4, 5];
function doInArray (array, func) {
for (item of array) {
func(item);
}
}
// console.log - console이란 객체에서 log란 키에 할당된 함수
doInArray(list, console.log);
여기서 doInArray가 고차함수고, console.log가 콜백함수이다.
function doNTimes (func, repeat, x, y) {
let result = x;
for (i = 0; i < repeat; i++) {
result = func(result, y);
}
return result;
}
console.log(
doNTimes((x, y) => x * y, 3, 5, 2),
doNTimes((x, y) => x / y, 3, 5, 2),
);
(x, y) => x * y, 3, 5, 2), (x, y) => x / y, 3, 5, 2) 와 같이
변수나 상수에 할당되지 않아 이름이 없는 애들을 익명함수라고 부른다
위의 코드같이 인자로 들어가는 순간 이름이 생긴다. (맞나?)
그니까 요 함수라는 것도 다른 함수로부터 return이 가능하다는 것.
const add = (a, b) => a + b;
const sub = (a, b) => a - b;
const mul = (a, b) => a * b;
const div = (a, b) => a / b;
function comb3ArmFuncs(armFunc1, armFunc2, armFunc3) {
return (x, y) => armFunc3(armFunc2(armFunc1(x, y), y), y);
}
const add_mul_sub = comb3ArmFuncs(add, mul, sub);
const mul_add_div = comb3ArmFuncs(mul, add, div);
const div_add_mul = comb3ArmFuncs(div, add, mul);
/*실행*/
console.log(
add_mul_sub(10, 4),
mul_add_div(10, 4),
div_add_mul(10, 4)
);
// 💡 타입에 안전한 버전
function getAverage() {
let result = 0, count = 0;
for (const num of arguments) {
if (typeof num !== 'number') continue; // continue는 loop 하나만 넘김
result += num; // result에 그 값을 더하고
count++; //하나씩 올려줌
}
return result / count;
}
console.log(
getAverage(2, '가', 8, true, 5)
);
어떠한 함수 안에서 해당 함수를 또다시 호출 하는거
자기 자신을 호출하는 함수. 잘못사용하면 무한 루프에 빠짐😥
그런데 한 함수가 다른 함수를 호출할때마다 컴퓨터 메모리에 스택이 쌓임
그래서 너무 많이 반복되겠다 싶으면 loop문을 사용하는게 좋음
재귀함수를 계속 쓰다가 스택이 점점 쌓이게 되다 보면 메모리의 한도를 넘어가게 됨
= 이게 stack overflow

대장님이 쓰시던 함수.........(익명함수)
(function(){
console.log('hello world!')
})();
jQuery에서도 쓰시던 구문이었는데, 도통 이해가 가지 않았음.
👨🌾 대장님 말씀 왈. 쉽게 이야기하면 감옥같은거지. 다른것과 꼬이지 않고 하나의 모듈처럼 작동하는···
라고 하시는데 처음인 으읭? 하다가 요새 조금씩 이해가 되는 상황.
이것저것 파보니 요즘은 잘 사용 안한다는 구문이라는데
여기는 합니다.. 해요.. 정부기관은 쓴다구여....

근데 이걸 사용한 이유가 var 때문이다. 얘가 블록 스코프 밖에서도 사용이 가능하기때문.
오늘날 const와 let이 있으니
let initialMessage;
{
const month = 8;
const day = 15;
const temps = [28, 27, 27, 30, 32, 32, 30, 28];
let avgTemp = 0;
for (const temp of temps) {
avgTemp += temp
}
avgTemp /= temps.length;
initialMessage = `${month}월 ${day}일 평균기온은 섭씨 ${avgTemp}도입니다.`;
};
console.log(initialMessage);
console.log(month); // 새로고침 후 const를 var로 바꾸고 실행해볼 것
👏👏👏 요러케!!! 요러케!!! 사용한다고 한다!
let x = 1;
let y = {
name: '홍길동',
age: 15
}
let z = [1, 2, 3];
function changeValue (a, b, c) {
a++;
b.name = '전우치';
b.age++;
c[0]++;
console.log(a, b, c);
}
changeValue(x, y, z);
console.log(x, y, z);
실행해 보면 원시타입인 x은 변경이 되지 않았지만, 참조타입인 y와 z는 변함
⭐️ 함수에 주어진 인자를 변경하는 것은 좋지 않음
일반적으로 대문자로 시작하고 객체들을 양산해내는 생성자 함수로 이해하면 된다.
- 👉🏻 function Cong(){} 이렇게
// 생성자 함수
function YalcoChicken (name, no) {
this.name = name;
this.no = no;
this.introduce = function () {
return `안녕하세요, ${this.no}호 ${this.name}점입니다!`;
}
}
// 인스턴스 생성
const chain1 = new YalcoChicken('판교', 3);
const chain2 = new YalcoChicken('강남', 17);
const chain3 = new YalcoChicken('제주', 24);
console.log(chain1, chain1.introduce());
console.log(chain2, chain2.introduce());
console.log(chain3, chain3.introduce());
어떠한 객체에 프로퍼티를 함수 내에서 사용하려면 this 사용
👇🏻 function으로 선언된 함수는 일반적으로 생성자 함수의 기능을 갖음

function YalcoChicken (name, no) {
this.name = name;
this.no = no;
this.introduce = function () {
return `안녕하세요, ${this.no}호 ${this.name}점입니다!`;
}
}
const chain1 = new YalcoChicken('판교', 3);
console.log(chain1);
// 본사에서 새 업무를 추가
// 프로토타입: 본사에서 배포하는 메뉴얼이라고 이해
YalcoChicken.prototype.introEng = function () {
return `Welcome to Yalco Chicken at ${this.name}!`;
};
console.log(chain1.introEng());
console.log(new YalcoChicken('강남', 17).introEng());