자바스크립트에서 함수는 소스코드의 집합으로 메소드, 모듈, 기능, 프로시저 등을 말하며, 자바스크립트에서는 function 자료형이다. 함수는 인자/매개변수, 리턴값을 가질 수 있다.
function 키워드에 함수명을 작성하여 사용하는방법(선언적함수)과 function에 함수명 작성하지않고 변수에대입하는방법(익명함수), 그리고 호출없이 바로 사용하는 스스로 동작하는 함수가 있다.
1. 함수 선언
1) 선언적 함수
function 함수명([매개변수]){
처리로직;
[return 되돌려줄값;]
}
2) 익명함수
이벤트 핸들러에서 주로 사용된다.
varf1 = function ([매개변수]){
처리로직;
[return 되돌려줄값;]
}
<button id = "btn2">실행확인 </button>
<p id="p2"></p>
<script>
var btn2 = document.getElementById("btn2")
btn2.onclick = function(){
document.getElementById("p2").innerHTML = "이벤트 핸들러를 통해 함수실행됨"
}
</script>
- 버튼의 요소를 받아서 btn2에 저장하고 .onclick메소드로 버튼이 클릭되었을 때 실행될 익명함수 작성
3) 스스로 동작하는 함수
(function(){
처리로직
})();
2. 함수 호출
함수는 반드시 선언이 되어야만 실행이 가능하다. 원하는 기능에 대한 함수를 호출하는 것을 함수 실행이라고 부르며 return값이 있다면 리턴 값을 받을 변수가 있어야 한다.
return 값이없는경우
함수명();
함수명(인자값1, 인자값2, …);
return 값이있는경우
var변수명= 함수명();
var변수명= 함수명(인자값1, 인자값2, …);
3. 매개변수
1) arguments : 모든 함수는 내부에 arguments라는 배열을 자동으로 생성하여 매개변수를 저장한다.
<button onclick="test5(11,22,33,1,2,6)">실행확인</button>
<p id="p5"></p>
<script>
function test5(){
console.log(arguments)
console.log(arguments.length)
var sum = 0;
for(var i=0; i<arguments.length; i++){
sum += arguments[i]
}
document.getElementById("p5").innerText = "더하기 결과 : "+sum; //innerText : 문자열만 넣을 때
}
</script>
2) 매개변수 함수에 this요소 전달하기
매개변수에 this를 넣어서 자신의 요소를 전달할 수도 있다.
- 버튼1 매개변수 : this ==> <button onclick="testFn(this);">버튼1</button>
- 버튼2 매개변수 : this.innerHTML ==> 버튼2
- 버튼3 매개변수 : this.value ==> 버튼3
<button onclick="testFn(this);">버튼1</button>
<button onclick="testFn(this.innerHTML);">버튼2</button>
<input type="button" onclick="testFn(this.value);" value="버튼3">
<script> //element 아니고 v 적어도 된다.
function testFn(element){
console.log(element)
}
</script>
4. 함수의 리턴
1) 익명함수를 리턴하는 함수
- test7()함수는 익명함수를 리턴하는 함수이다.
- id가 btnTest인 버튼을 클릭할 경우 btnTest.onclick()함수가 실행된다.
따라서 test7()함수가 실행이 되므로 익명함수가 리턴된다. - console.log(test7())는 아래와 같으므로 익명함수가 리턴된 것을 확인할 수 있다.
ƒ (){
alert(userName + "님 환영합니다.")
}
이름 : <input type="text" id="name">
<button onclick="test7()()"> 실행확인</button>
<button id="btnTest">익명함수 리턴 확인</button>
<script>
function test7(){
var userName = document.getElementById("name").value
return function(){
alert(userName + "님 환영합니다.")
}
}
btnTest.onclick = ()=>{
console.log(test7())
}
</script>
2) 호이스팅
함수와 변수는 코드를 실행하기 전에 실행될 내용을 메모리에 저장하는데 이것을 호이스팅이라고 한다.
- 함수는 전체 함수에 대한 참조와 함께 저장된다.
따라서 호출보다 함수의 선언식이 아래에 있어도 호이스팅이 일어나서 참조가 가능하다. - var 변수/함수 : 선언은 호이스팅이 되지만 값을 할당하는 것은 호이스팅이 되지 않는다. 따라서 undefined로 저장된다.
- let, const 변수 : 호이스팅이 발생하지 않아서 ReferenceError: Cannot access 'name11' before initialization 에러를 발생시킨다.
<button onclick="test6()()"> 실행확인</button>
<P id="p6"></P>
<script>
function test6(){
alert(test11);
var test11 = 5; //undefined -> 선언만 호이스팅되고 할당은 안됨
let name11 = "test5" //var 제외한 변수는 호이스팅안됨
var p6 = document.getElementById("p6")
var value = returnFunction();
p6.innerHTML = value;
//1. 함수 선언식 -> 호출보다 아래에 있어도 위로 끌어올려지는(호이스팅)이 일어나서 제대로 호출이 된다.
function returnFunction(){
return Math.floor(Math.random()*100)+1
}
//2. 함수표현식 -> 같은 함수 내에서는 (호이스팅)이 일어나지 않아서 제대로 호출이 되지 않는다.
//이 함수 밖에 적으면 전역처럼 먼저 읽혀져서 밖에 적으면 가능하다.
/*
var returnFunction = function(){
return Math.floor(Math.random()*100)+1
}
*/
}
</script>
5. Array.prototype.map()
map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환한다.
- 반환값 : 배열의 각 요소에 대해 실행한 callback의 결과를 모은 새로운 배열
(각 배열의 요소마다 callback실행한다!)
arr.map(callback(currentValue[, index[, array]])[, thisArg])
매개변수로 다음 인수들을 갖는 callback함수를 가진다.
- currentValue : 처리할 현재 요소
- [optional] index : 처리할 현재 요소의 인덱스
- [optional] array : map()을 호출한 배열
- [optional] thisArg : callback을 실행할 때 this로 사용되는 값
6. 화살표함수
화살표 함수는 ES6문법으로 function키워드를 사용해서 함수를 만든 것보다 간단하게 표현할 수 있다.
그리고 화살표 함수는 항상 익명함수이다.
// 매개변수 지정 방법
() => { ... } // 매개변수가 없을 경우
x => { ... } // 매개변수가 한 개인 경우, 소괄호를 생략할 수 있다.
(x, y) => { ... } // 매개변수가 여러 개인 경우, 소괄호를 생략할 수 없다.
// 함수 몸체 지정 방법
x => { return x * x } // single line block
x => x * x // 함수 몸체가 한줄의 구문이라면 중괄호를 생략할 수 있으며 암묵적으로 return된다. 위 표현과 동일하다.
() => { return { a: 1 }; }
() => ({ a: 1 }) // 위 표현과 동일하다. 객체 반환시 소괄호를 사용한다.
() => { // multi line block.
const x = 10;
return x * x;
};
- var test1 = ( ) => { }
- var test1 = ( ) => console.log('test1');
- 한 줄로 표현할 때는 "{ }"없이 적을 수 있다.
/*function test1(){
var p1 = document.getElementById("p1")
p1.innerHTML = "test1()함수를 실행"
}*/
//매개변수 없을 때 ()축약형
const test1 = ()=>{
var p1 = document.getElementById("p1")
p1.innerHTML = "test1()함수를 실행"
}
참고 및 출처
1. kh정보교육원 강의자료
2. https://velog.io/@hoo00nn/%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85Hoisting-%EC%9D%B4%EB%9E%80
3. https://poiemaweb.com/es6-arrow-function
'Web > Frontend' 카테고리의 다른 글
웹 페이지 실행순서 (0) | 2022.06.29 |
---|---|
[javascript/jquery] Uncaught Error: Syntax error, unrecognized expression 오류 해결 (0) | 2022.05.19 |
[Vue] Project 구조 (0) | 2021.08.06 |
[Javascript] 배열 (0) | 2021.07.24 |
[Javascript] 변수형과 자료형 (0) | 2021.07.22 |