함수는 .... 수납상자! 코드를 정리정돈 할 수 있다.
input id="night_day" 태그 안에 배경색과 글꼴색을 변경하는 코드가 들어가있다.
input 태그가 1억개라면...? color 색상을 다른 색으로 변경하려면...?
또한, 복사하여 만든 버튼들이 완전히 같은 코드 라고 확신하기 쉬울까..?
NO... 일일이 확인해야 한다.
목표 : 중복되는 코드를 함수로 만든다. 효율적이고 유지보수가 용이해지도록 리팩토링
- 코드 중복 제거를 통한 웹페이지 사이즈 감소
- 효율성 증가
- 유지보수 용이
- 동일한 함수를 호출하고 있다는 점에서 똑같은 로직을 수행하고 있음을 확인하기 쉬움
- 함수명을 통해 함수가 하는 기능에 대하여 이해하기 쉬움
1. 함수의 기본
Function, 객체의 메소드(Method)
- 파라미터(parameter) , 아규먼트(argument), 리턴(return)
연속적이지 않게 반복된다면 반복문을 사용하는 것이 어렵거나 불가능해진다. -> '함수'를 이용하면 된다.
함수를 의미하는 키워드로 function을 쓰고 함수명(파라미터){ 재사용하려는 코드.. } 로 작성하면 된다.
<!-- 함수 사용 전 -->
<script>
document.write('<li>1</li>');
document.write('<li>2-1</li>'); // 반복되는 부분(1)
document.write('<li>2-2</li>'); // 반복되는 부분(2)
document.write('<li>3</li>');
document.write('<li>2-1</li>'); // 반복되는 부분(1)
document.write('<li>2-2</li>'); // 반복되는 부분(2)
two();
</script>
<!-- 함수 이용 -->
<script>
function two(){ //함수정의
document.write('<li>2-1</li>'); //반복하려는 코드
document.write('<li>2-2</li>');
}
document.write('<li>1</li>');
two(); //함수호출
document.write('<li>3</li>');
two();
</script>
2. 매개변수(parameter)와 인자(argument)
함수는 '입력'과 '출력'으로 이루어져 있다.
함수 == 자판기
'입력' : 사용자가 제품을 선택
'출력' : 자판기가 해당하는 제품을 제공
입력 - 매개변수(parameter) : 함수정의 시 , 인자(argument) : 함수호출 시
출력 - 반환(return)
onePlusOne() 함수는 항상 1+1 의 결과값이 2 를 리턴한다.
<script>
function onePlusOne(){
document.write(1+1);
}
onePlusOne(); //함수를 호출하면 언제나 같은 결과를 return 한다. //2
</script>
넘겨주는 값에 따라 다른 결과 값을 얻고 싶다면 ?
sum(2,3); //5
sum(3,4); //7
함수 정의
function 함수명( 매개변수정의1, .... , n개) { ...code... }
function sum( param1 , param2 ) { ...code...}
함수 호출
함수명( 인자1 , .... , n개 );
sum( argu1 , argu2 );
<script>
function onePlusOne(){
document.write(1+1+'<br>');
}
function sum(x,y){
document.write(x+y+'<br>');
}
onePlusOne();
sum(2,3); //5
sum(3,4); //7
</script>
3. 반환(return)
표현식(expression) ?
1+1 은 숫자 2에 대한 표현식
2-1 은 숫자 1에 대한 표현식
1===1 은 Boolean 'true'라는 값에 대한 표현식
목표 :
지금은 sum(2+3); 을 호출하면 sum 함수를 통해서 결과값 5를 화면에 출력하고 있다.
sum(2+3); 의 호출 결과로 화면에 출력이 아닌 5 라는 숫자결과 값을 표현하는 '표현식'으로 만든다.
sum(2+3) 결과를 출력하는 글꼴의 색을 바꾸고 싶다면?
sumColorRed(x,y){...code...} 글꼴색을 바꿔서 출력하는 함수를 새로 만들어야한다.
'+'라는 기능을 무수히 많이 쓴다면, 그 때마다 새로운 함수를 만드는 것이 아니라 '+'한 결과 값을 가져오는 표현식으로 만든 뒤, 글꼴 색을 처리하고.. 기타 작업을 해주면 효율적이다.
<script>
function onePlusOne(){
document.write(1+1+'<br>');
}
function sum(x,y){
document.write(x+y+'<br>');
}
function sumColorRed(x,y){
result = x+y;
document.write('<div style="color:red;">'+result+'</div></br>');
}
onePlusOne();
sum(2,3); //5
sumColorRed(2,3); // 5, Red
sum(3,4); //7
</script>
함수 sum2 는 x, y 라는 매개변수를 통해 들어간 값을 return 을 통해서 결과를 반환함으로써 다양한 용도로 함수를 활용할 수 있게 된다!!
<script>
function sum2(x,y){
return x+y;
}
document.write(sum2(2,3)+'<br>');
document.write('<div style="color:red;">'+sum2(2,3)+'</div>');
document.write('<div style="font-size:3rem;">'+sum2(2,3)+'</div>');
</script>
함수의 활용
목표 : night, day 버튼의 기능을 함수를 이용해 코드를 효율적으로 래팩토링
<!-- 수정 전 코드 -->
<input type="button" value="night" onclick="
var target = document.querySelector('body');
var alist = document.querySelectorAll('a');
if(this.value === 'night'){
target.style.backgroundColor = 'gray';
target.style.color = 'white';
this.value='day';
var i=0;
while( i < alist.length ){
alist[i].style.color = 'orange';
i++;
}
}else{
target.style.backgroundColor = 'white';
target.style.color = 'black';
this.value='night';
var i=0;
while( i < alist.length ){
alist[i].style.color = 'black';
i++;
}
}
">
<!-- 함수를 이용한 코드 리팩토링 -->
<script>
function changeMode(self){
var target = document.querySelector('body');
var alist = document.querySelectorAll('a');
if(self.value === 'night'){
target.style.backgroundColor = 'gray';
target.style.color = 'white';
self.value='day';
var i=0;
while( i < alist.length ){
alist[i].style.color = 'orange';
i++;
}
}else{
target.style.backgroundColor = 'white';
target.style.color = 'black';
self.value='night';
var i=0;
while( i < alist.length ){
alist[i].style.color = 'black';
i++;
}
}
}
</script>
<input type="button" value="night" onclick="changeMode(this)">
onclick 이라는 이벤트 안에서 this 는 이 이벤트가 소속된 태그를 가리키도록 약속되어있는데
독립된 함수를 만들게 되면, 함수 안의 this 는 더이상 input 버튼이 아닌 '전역객체'를 가리키게된다. ( ex. 웹브라우저에서 윈도우 )
이 this의 값을 input 버튼을 가리키게 하기 위해서 nightDayHandler 가 실행될 때, 인자로 this 값을 넘긴다.
self 란 이름의 매개변수로 this 를 받아서 사용하면 된다.
'코딩공부 > WEB2 - JavaScript' 카테고리의 다른 글
[10] 파일로 쪼개서 정리 정돈하기 (0) | 2019.09.09 |
---|---|
[9] 객체 (0) | 2019.09.07 |
[7] 배열과 반복문 (0) | 2019.09.06 |
[6] 리팩토링(refactoring) - 중복의 제거, this 키워드 (0) | 2019.09.06 |
[5] 조건문 (0) | 2019.09.06 |