텍스트## 1. 함수
특정 코드를 하나의 명령으로 실핼 할 수 있게 해주는 기능, 어떤 일의 단위
이 장에서는 함수를 알아보자
함수는 기본적으로 다음과 같은 형식이다.
function 함수이름 (매개변수) {
함수가 할 일;
return 반환
}
반환값
, 함수 완료 후, 반환되어야 하는 값이 있을 때 사용한다.함수를 선언하고, 지역 변수와 외부 변수를 알아보자
function showMessage() { // 함수 선언
let message = "안녕하세요"; // 지역 변수
console.log( message ); // 안녕하세요가 출력 된다
};
showMessage(); // 안녕하세요가 출력 된다
console.log( message ); // ReferenceError: message is not defined
왜 이런 결과가 나올까?
showMessage
함수의 지역 변수 이기에 외부에서는 호출이 되지 않는 성질을 가지기 떄문이다.함수에선 외부 변수에 접근, 수정이 가능하다.
let userName = "John";
function showMessage() {
userName = "Bob"; // (1)
let message = "hello" + userName;
console.log(message);
};
console.log( uesrName ); // (2) John이 출력된다.
showMessage(); // (3)
console.log( userName ); // (4) Bob이 출력된다.
(1) - 외부 변수 userName
을 함수 내부에서 수정함
(2) - 수정한 함수를 호출하지 않기에 John이 출력된다.
(3) - 수정한 함수를 호출
(4) - 외부 변수를 수정한 함수에 의해 Bob으로 출력이 된다.
동작을 수행하기 위한 코드
showMessage()
getAge()
calcSum()
createForm()
checkPermission()
함수는 동작 하나만 담당해야 한다.
// 함수 선언문
function sum(a,b) {
return a + b;
}
// 함수 표현식
let sum = function(a,b) {
retrun a+ b;
};
// 함수 선언문
greet("Hyun"); // 안녕하세요! Hyun님 출력
function greet(name) {
console.log(`안녕하세요! ${name}님`);
}
// 함수 표현식
greet("Hyun"); // TypeError: greet is not a function
const greet = function(name) {
console.log(`안녕하세요! ${name}님`);
};
- 어떠한 함수가 실행이 끝난 뒤 호출되는 함수
- 함수가 어떤 이벤트가 발생, 특정 시점에서 호출 되게끔 하는 함수
- 주로 비동기 작업에서 사용이된다.
function fetchData(url, callback) {
console.log(`데이터를 ${url}에서 가져오는 중..`);
setTimeout(function() {
const data = "가져온 데이터";
callback(data); // 콜백 함수 호출
}, 2000);
}
fetchData("https://example.com/data", function(result){
cosnole.log(`데이터를 가져오는데 성공했습니다 ${result}`);
})
fetchData
함수가 호출되면서 데이터를 가져오는 중.. 메시지 호출setTimeout
내부의 콜백 함수가 실행되고, 가져온 데이터가 callback
을 통해 전달fetchData
함수 완료 후 데이터를 가져오는데 성공했다는 메시지 출력-> 콜백 함수
는 주로 비동기 작업의 완료를 처리하거나 특정 이벤트가 발생할 떄 실행되어야 하는 작업을 할 때 사용한다.
함수 표현식보다 단순하고 간결하게 함수를 만들기
let func = (arg1, arg2, ... argN) => experssion
arg1, ..argN
을 인자로 받는 함수 func
생성func
함수는 =>
우측의 표현식(expression)을 평가하고 결과를 반환function ask(question, yes, no) {
if (confirm(question)) yes()
else no();
}
ask(
"동의하십니까?",
function() { alert("동의하셨습니다."); },
function() { alert("취소 버튼을 누르셨습니다."); }
);
let ask = (question, yes, no) => confirm(question) ? yes() : no();
ask(
"동의하십니까?",
() => alert("동의하셨습니다."),
() => alert("취소 버튼을 누르셨습니다.")
);
const greet = function (name) {
console.log(`안녕하세요 저는 ${name}입니다.`);
};
greet("동현");
meetAt
함수 만들기 const meetAt = function (year, month, date) {
let todayYear = year;
let todayMonth = month;
let todayDate = date;
if (todayDate) {
return `${year}/${month}/${date}`;
}
if (todayMonth) {
return `${year}년 ${month}월 입니다.`;
}
if (todayYear) {
return `${year}년 입니다.`;
}
};
console.log(meetAt(1997, 08,22));
- 처음에
todayYear
를 가장 위로 올리고todayDate
를 가장 밑에 했더니
계속 년도만 표시 되었다return
은 첫 번째 조건이 만족되면 함수가 즉시 반환되는
특성을 몰랐기에 발생한 문제였다.
findSmallestElement
함수 구현하기function findSmallestNumber(arr) {
let result = arr[0];
if (arr.length === 0) {
return 0;
}
for (let i = 1; arr.length > i; i++) {
if (result > arr[i]) {
result = arr[i];
}
}
return result;
}
let smallestNumber = findSmallestNumber([1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10]);
console.log(smallestNumber);
for
문을 forEach
문으로 바꿔보자
function findSmallestNumber(arr) {
let result = arr[0];
if (arr.length === 0) {
return 0;
}
arr.forEach(function (num) {
if (result > num) {
result = num;
}
});
return result;
}
let smallestNumber = findSmallestNumber([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
console.log(smallestNumber);
- 이 문제의 포인트는 비교를 해서 작은 값이 나오면 다음값과 비교를 하는 것 그러고 끝이 되었을 때 작은 값을 return하는 것이다.
let unit = [50000, 10000, 5000, 1000, 500, 100];
function calcChages(money) {
let result = "";
for (let i = 0; i < unit.length; i++) {
let count = Math.floor(money / unit[i]);
if (count > 0) {
result += `가장 최소 지폐는 ${unit[i]} X ${count}장 입니다.\n`;
}
money = money - unit[i] * count;
}
return result;
}
const chageDetails = calcChages(234500);
console.log(chageDetails);
- 기준이 되는 배열을 만든다
- 나머지는 버린다.
Math.floor
- 해당 결과값을 변수에 저장하고 반환한다.