자바스크립트의 꽃🌹
참고영상: 드림코딩 | 자바스크립트 기초 강의
(추후 더 자세히 공부하겠지만) 자바스크립트도 절자지향 언어라고 할 수 있다.
👉🏻 function이 매우 중요한 기능을 담당
서브 프로그램이라고 할 정도로 각각의 작은 기능들을 하는 것이 바로 함수, function !
input이 들어가면, 이걸 잘 처리한 다음에 output을 return하는 것 !
function name(param1, param2){
body
...
return
}
function printHello(){
console.log('Hello')
}
printHello() // 함수 호출
여기서 좀 더 유용한 함수를 만든다카면?
function log(msg){
console.log(msg)
}
log('Hello')
이런식으로 파라미터로 전달 받아서 얘를 가지고 출력하는 형식이 더 좋다.
※ 자바스크립트는 타입이 따로 없다!
function changeName(obj){
obj.name = 'park'
}
const yang = {name: 'kim'}
changeName(yang)
console.log(yang)
전달된 object의 이름을 무조건 park으로 바꾸는 함수를 작성하였다.
ES6에 추가됨
function showMsg(msg, from){
console.log(`${msg} by ${from}`)
}
showMsg('hi')
만약 from
의 파라미터를 전달하지 않으면?
정해지지 않았기 때문에 undefined가 출력된다.
추가되기 전에는 만약 undefined면 'unknown'이 출력
되도록 만들어 사용하곤 했다.
function showMsg(msg, from){
if(from === undefined){
from = 'unknown'
}
console.log(`${msg} by ${from}`)
}
showMsg('hi')
ES6에 추가됨
...
을 사용하면 배열 형태로 전달됨
function printAll(...args){
for(let i=0; i<args.length; i++){
console.log(args[i])
}
}
printAll("yang", 'won', 'kim', 'cheerup!!')
"yang", 'won', 'kim', 'cheerup!!'
이 배열 형태로 전달된다.
함수를 실행시키면,
이렇게 잘 나오는 것을 확인 !
for(const arg of args){
console.log(arg)
}
이렇게 하면 args 안에 있는 원소들이 arg가 되어 차례로 출력된다.
args.forEach((arg) => console.log(arg))
그냥 한줄로도 쌉가능~
밖에서는 안이 보이지 않고, 안에서만 밖을 볼 수 있다.
let globalMessage = 'global'
function printMessage(){
let message = 'hello'
console.log(message)
console.log(globalMessage)
}
printMessage()
message
는 안에서만 볼 수 있음.globalMessage
를 호출할 수 있음let globalMessage = 'global'
function printMessage(){
let message = 'hello'
console.log(message)
console.log(globalMessage)
function printAnother(){
console.log(message)
let childMessage = 'what?'
}
}
printMessage()
printMessage
의 안에 있는 printAnother
역시 마찬가지다.
printAnother
은 printMessage
에 있는 변수를 볼 수 있음printMessage
가 childMessage
를 호출할 수 없음함수가 중첩 -> closure
이부분은 나중에 더 자세히..
모든 함수는 return undefined
이거나 return (지정한 무엇)
이다.
function sum(a, b){
return a+b
}
const result = sum(1, 2)
console.log(`sum: ${sum(1, 2)}`)
function upgradeUser(user){
if(user.point > 10){
// upgrade logic...
}
}
👎🏻 이건 가독성이 떨어지는 안좋은 방법
function upgradeUser(user){
if(user.point <= 10){
return
}
// upgrade logic..
}
👍🏻 좋은 방법
📌 즉, 조건에 맞지 않으면 그냥 끝내버리고, 조건에 맞는 경우에만 긴 logic을 시행하도록 하는 것!
다시 말해,
빨리 return을 하고, 필요한 로직들을 그 밑에 작성하는 것이 더 좋음
const print = function(){ // anonymous function
console.log('print')
}
print()
함수를 print
라는 변수에 할당
print라는 변수에 함수를 호출하듯이 하면됨
const print = function(){
console.log('print')
}
print()
const printAgain = print;
printAgain()
새로운 변수에 print를 할당하면?
함수를 할당하였으므로, 똑같이 실행된다.
함수를 변수에 할당해서 함수처럼 사용할 수 있다.
function randomQuiz(answer, printYes, printNo){
// printYes, printNo 라는 각각의 함수를 전달
if(answer === 'love you'){
printYes();
} else {
printNo()
}
}
두가지의 콜백 함수가 전달됨
function randomQuiz(answer, printYes, printNo){
// printYes, printNo 라는 각각의 함수를 전달
if(answer === 'love you'){
printYes();
} else {
printNo()
}
}
const printYes = function(){
console.log("yes")
}
const printNo = function print(){
// named => 디버깅할때 함수 이름이 나오게 하기 위하여
// 혹은 재귀를 돌리기 위해
// print()
console.log("no")
}
randomQuiz("wrong", printYes, printNo)
randomQuiz("love you", printYes, printNo)
※ 이름이 없는 anonymous function
const simplePrint = function(){
console.log("simplePrint")
}
기존 function 선언 방식은 이렇게 function
도 써야하고.. {}
처리도 해줘야 하고..
너무 번거로움 ㅜㅜ
👍🏻 그러나 이를 arrow function으로 하면 정말 간단함
const simplePrint = () => console.log("simplePrint")
한줄이면 끝 !
물론 parameters도 전달할 수 있다.
const add = (a, b) => a + b
이렇게 한줄인 경우에는 {}
없이 가능하다.
만약 좀 더 다양한 일들을 해야 한다면
const add = (a, b) => {
// do something..
return a + b
}
블럭 처리를 해야 한다.
📌 블럭처리를 한다면 return
을 써줘야 한다.
원래 함수를 만들었으면, 따로 함수를 호출해야 하는게 정석.
하지만 선언과 동시에 호출하려면??
(function hello(){
console.log('IIFE')
})();
최근엔 잘 쓰이지 않지만,
함수를 바로바로 사용하고 싶을 때 유용하다.