웹개발 교육/JavaScript

[13일] JavaScript (7) - 함수, 내장 객체, Scope, 디지털 시계 만들기

ewok 2022. 8. 11. 18:15
// 3. 리턴값이 있는 경우
//   - 함수는 호출한 시점으로 되돌아온다(return)
//   - 리턴값 : 값을 가지고 호출한 시점으로 되돌아온다
//   - 리턴값 : 1개만 가능하다
//   - 형식) return 값
function test1() {
    document.write("SEOUL");
    return;  //호출 시점으로 되돌아간다
             //맨 마지막 return은 생략 가능하다
} //test1() end

test1(); //함수 호출

 

 

function test2(a) {
    if(a<0) {
        return;
    }
    document.write(a);
} //test2() end

test2(3);
test2(-5);  // 출력 안됨

 

 

function test3(a, b) {
    let c=a+b;
    return c;   //c값을 리턴 (1개만 리턴할 수 있다)
} //test3() end

let result = test3(6, 7);
document.write(result);     //변수값
document.write(13);         //상수값
document.write(test3(8, 9)); //함수의 리턴값

 

 

문제 1

//문1) 팩토리얼값을 구하시오 (4*3*2*1)

function fact(f){
    let gop=1;
    for(a=f; a>=1; a--){
        gop=gop*a;
    }//for end
    return gop;
}//fact() end

let gop = fact(4);
document.write(gop);

 

 

문제 2

//문2) 윤년, 평년을 구하시오

function leap(year){
    if(year%4==0 && year%100!=0 || year%400==0){
        return true;
    }else{
        return false;
    } //if end
} //leap() end

if(leap(2022)){
    document.write("윤년");
}else{
    document.write("평년");
}//if end

 

 

재귀적 함수 호출

//4. 재귀적 함수 호출
// -> 자신이 자신의 함수를 호출할 수 있다
document.write(test(3));  //3팩토리얼값 구하기
function test(f){
    if(f==0){
        return 1;
    }else{
        return f*test(f-1);
    } //if end
} //test() end
/*
    if(3==0)
    else
            3*test(3-1)
                if(2==0)
                else
                        2*test(2-1)
                            if(1==0)
                            else
                                    1*test(1-1)
                                        if(0==0)    1
*/

 

내장 객체

  • Object = 멤버 변수 + 멤버 함수로 구성
  • 멤버 변수, property, attribute, field, column
  • 멤버 함수, fucntion method
  • 객체명.멤버변수
  • 객체명.멤버함수()
// 1. Math 객체
document.write(Math.abs(-3));
document.write(Math.PI);
//2. Number 객체
document.write(Number("5"));
document.write(Number("8.9"));
//3. Date 객체
const d=new Date();
// 4. Window 객체
// 참조 https://www.w3schools.com/jsref/obj_window.asp
// 객체명을 생략할 수 있다

// 1) alert() 경고창(확인)
window.alert();
alert();
alert(123); 경고창에 문구 출력
alert("KOREA");
alert("SEOUL");
alert("'");
alert('"');
alert("\"");
alert('\'');
alert("서울\n제주\n\n부산"); // \n줄바꿈

// 2) confirm() 경고창(확인, 취소)
// -> boolean(true, false)값으로 반환된다
window.confirm();
confirm(); // window객체명 생략 가능
let flag = confirm("영구히 삭제됩니다\n지울까요?");
alert(flag);

// 3) 새창 띄우기
window.open();

// 4) 인쇄창 띄우기
window.print();

// 5) setInterval()과 setTimeout()
/*
    - 주어진 시간에 따라 자동으로 함수 호출
    - 시간 : 1 second = 1000 miliseconds.
    - new version
        setInterval(함수명, 시간) : 주기적으로 함수 호출
        setTimeout(함수명, 시간) : 한 번만 호출
    - old version
        setInterval("함수명()", 시간) : 주기적으로 함수 호출
        setTimeout("함수명()", 시간) : 한 번만 호출
    - 시간해제 : claerInterval(), clearTimeout()
*/

function hello(){
    alert("안녕하세요~");
} //hello() end
setInterval(hello, 3000);    //3초마다 주기적으로 hello함수를 호출
setTimeout(hello, 3000);     //3초후에 hello함수 단 1번만 호출

/*
    재귀적 함수 호출 관계를 이용해서 3초마다 주기적으로 hello함수 호출
    function hello(){
        setTimeout(hello, 3000);
    }
*/
// 5. screen 객체
// -> 사용자 device의 해상도 확인
alert(screen.width);
alert(screen.height);
// 6. location 객체
// -> 페이지 이동
// -> location.href="URL 또는 페이지명"
// -> location="URL 또는 페이지명"
location.href="https://www.itwill.co.kr/"
location.reload(); //현재 페이지 새로고침
// 7. history 객체
// -> 뒤로, 앞으로
history.back();     // 뒤로
history.forward();  // 앞으로
history.go(-2);     // 뒤로 뒤로

 

변수의 유효 범위(scope)

변수의 종류

  • 지역변수(local variable) : function 함수 내에 선언된 변수는 함수 내에서만 사용 가능하다
  • 전역변수(global variable) : function 함수 외부에서 선언된 변수로 모든 함수 내에서 그 값을 공유

지역변수가 전역 변수보다 우선순위가 높다.

let one="하나";  //전역변수

function test3(){
    alert("one : " + one);
    alert("two : " + two);
    alert("three : " + three);
}//test3() end

let two="둘";   //전역변수

function test4(){
    alert("one : " + one);
    alert("two : " + two);
    alert("three : " + three);
}//test4() end

let three="셋"; //전역변수
let one="하나";  //전역변수

function test3(){
    alert("one : " + one);
    alert("two : " + two);
    alert("three : " + three);
    let uid="아이티윌";
    alert(uid);
    // alert(upw);  에러 upw is not defined
}//test3() end

let two="둘";   //전역변수

function test4(){
    alert("one : " + one);
    alert("two : " + two);
    alert("three : " + three);
    let upw="1234";
    alert(upw);
    // alert(uid);  에러 upw is not defined
}//test4() end

let three="셋"; //전역변수

이 경우 test3()의 alert(upw)는 실행되지 않는다. 또한, test4()의 alert(uid)도 실행되지 않는다.

 

 

디지털시계 만들기

<body>
    <h3>디지털 시계</h3>
    <div id="clock"></div>
    <hr>
    <input type="button" value="시작" onclick="showtime()">
    <input type="button" value="중지">
    <script>
        function showtime(){
            const d = new Date();
            let  today="";                
            today += d.getFullYear() + ".";
            if(d.getMonth()+1<10){
                today += "0";
            } //if end
            today += d.getMonth()+1 + ".";
            if(d.getDate()<10){
                today += "0";
            } //if end
            today += d.getDate();
            switch(d.getDay()) {
                case 0 : today+=" (일) "; break;
                case 1 : today+=" (월) "; break;
                case 2 : today+=" (화) "; break;
                case 3 : today+=" (수) "; break;
                case 4 : today+=" (목) "; break;
                case 5 : today+=" (금) "; break;
                case 6 : today+=" (토) "; break;
            }
            if(d.getHours()<12){
                today += " AM ";
            }else{
                today += " PM ";
            }//if end
            if(d.getHours()<13){
                today += d.getHours() + ":";
            }else{
                today +=d.getHours()-12 + ":";
            }//if end
            if(d.getMinutes()<10) {
                today += "0" + d.getMinutes() + ":";
            } else {
                today += d.getMinutes() + ":";
            }
            if(d.getSeconds()<10) {
                today += "0" + d.getSeconds();
            } else {
                today += d.getSeconds();
            }
            
            document.getElementById("clock").innerText=today;
            setTimeout(showtime, 1000);  //1초 후에 showtime 함수를 호출
        }//showtime() end
        
    </script>
    
</body>

 

killtime 함수를 이용하여 시계를 멈추기 위해서는 showtime 함수 안에 있는 setTimeout에 접근할 수 있어야 한다.

이때 killtime과 setTimeout을 연결하기 위해 전역 변수를 이용할 수 있다.

...
	timer = setTimeout(showtime, 1000);  //1초 후에 showtime 함수를 호출
}//showtime() end
let timer; //전역변수
            
function killtime(){
    clearTimeout(timer);  //시간해제
}//killtime() end

 

 

 

 

음악 재생 목록 만들기

<body>
    <div style="text-align: center;">
        <h3>음악목록</h3>
        <img src="../../music/gangnamstyle.jpg" id="poster" width="300px" height="250px">
        <br><br>
        <audio src="../../music/gangnamstyle.mp3" id="audio1" controls></audio>
    </div>
    <hr>
    <div style="margin: auto; width: 50%;">
        <ol>
            <li><a href="javascript:loadMusic('../../music/genie.jpg', '../../music/genie.mp3')">소원을 말해봐</a></li>
            <li><a href="javascript:loadMusic('../../music/sheis.jpg', '../../music/sheis.mp3')">그녀가 처음 울던 날</a></li>
            <li><a href="javascript:loadMusic('../../music/candy.jpg', '../../music/candy.mp3')">내 귀에 캔디</a></li>
            <li><a href="javascript:loadMusic('../../music/gangnamstyle.jpg', '../../music/gangnamstyle.mp3')">강남스타일</a></li>
        </ol>
    </div>
    <script>
        function loadMusic(jpg, mp3){
            let poster = document.getElementById("poster");
            let audio1 = document.getElementById("audio1");
            poster.src=jpg;
            audio1.src=mp3;
            audio1.play();
        }//loadMusic() end
    </script>
    
</body>